代码段一:
char* str="9.20";
double d=atof(str);
d=d*100;
long a=d;代码段二:
double a1=920.00000000000;
long a=a1;
结果代码段一的a值是919,代码段二的a值是920,问题出在哪里?(在VC6.0下编译)
char* str="9.20";
double d=atof(str);
d=d*100;
long a=d;代码段二:
double a1=920.00000000000;
long a=a1;
结果代码段一的a值是919,代码段二的a值是920,问题出在哪里?(在VC6.0下编译)
解决方案 »
- 今天突然发现还有小问题不明白!请教大家了!!!!
- 只求有耐心的人帮我一下,谢谢了(因为我这一个问题问了两个星期了,没人搭理我)
- 如何做个像 注册表 那样的界面及功能??
- 一个API HOOK的问题~
- 如何求日期和时间差!
- 不惜分数,只求真理,该死的字符串(其实会者不难...)
- 请问诸位高手?
- 编译时出现"left operand must be l-value"是什么意思,
- 如何用mfc实现一个activex控件的自定义接口
- 请问如何能让win9x自动登录??!
- ★★★基础太差,char怎么在赋值时才确定长度,就是任意长度都能赋进去?★★★
- 设置一个全局钩子,当应用程序退出时,如何保证它所在的动态库不被卸载
double 的存储形式
1bit 符号 11 bit 指数(2进制) 52bit有效值部分
920.0000 直接转换成2进制的科学记数法
9.2 * 100
9.2和100被分别拆成科学记数法,再计算,共产生了三次误差
------- ------- ------ --------
8位 8位 7位
-----------------------
有效部分,右边是高位,所以是1/8
有效值为1+1*(八分之一) = 1.25
符号位1bit
指数部分exp, 8bit 范围[0,255]
有次数部分value,23bit,范围[0,max],max的值是23位全部是1
为正:
[ 1 + 1 * ((float)value/max)] * 2^(exp - 127)
0x00 0x00 0x80 0x3f
倒置
0x3f800000
0 01111111 0000000 00000000 00000000
--- ------- -------------------------
符号 指数127 有效部分0结果为 (1+ 1 * 0) * 2的(127-127)次方 = 10x00 0x00 0x20 0x40
倒置
0x40 0x20 0x00 0x00
0 10000000 0100000 00000000 00000000
----- -------- -------------------------
1bit 8bit 23bit,最大值为1/4故为 (1+1*(1.0/4)) * 2的(128 -127)次方 = 1.25 * 2 = 2.5include <stdio.h>
#include <math.h>
#include <memory.h>int main()
{
int int_1 = 2;
float float_2 = 2.5;
char temp[5]="0000";
memcpy(temp,&float_2,4);
/* printf("%f, %d\r\n", int_1, float_2);
printf("%f", pow(2, 30)+ pow(2, 21));
scanf("%d",int_1);*/
return 0;
}---------------------------
技术上可行
符合你的要求吗?
如果不明白
请给我发短消息
请附: 帖子的地址
或在
http://www.338888.com/VCShare/Default.asp
上提问