超级高手看过来(怪事年年有,今年特别多)

csdnflysnow 2001-06-06 07:37:00
遇到一浮点数的怪事。简化出来的程序如下。

VC6+SP4 Win32 console 程序,还未用其它编译器试过

#include "stdafx.h"
#include "stdlib.h"

int main(int argc, char* argv[])
{
float temp = atof("1210952.74");
printf("temp is %f\n",temp);
printf("temp is %f\n",temp);
return 0;
}

两次打印出来的值不一样。
有人说是浮点数的精度问题,但没法解释上面的现象。
照程序调用方式来看,我用的是值传递,每次调用printf 是都是将temp的值压入堆栈,所以两次的结果没有理由不一样。


看看哪位大侠能够解释 ?学生先谢过了。

如果没人能解释,实在不行,我可能要跟踪一下它的汇编代码了。:(





...全文
97 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
csdnflysnow 2001-06-06
  • 打赏
  • 举报
回复
在我的机器上第一次打印是1210952.74.
第二次打印是1210952.75
to duz:
你的解答非常的道理,看来是此中高手,有空多联络。能回答出这道题目的,功底要非常的扎实。我猜duz兄应该是那种软硬兼施的高手,如不嫌弃小弟才疏学浅,就教个朋友!QQ(134864)
email: flysnow@21cn.com

to egyptcaesar:
谢谢!我知道转成double就可以了,我要知道的是如何解释上面的现象!
其它人还有什么更合理的解释,欢迎提出!


egyptcaesar 2001-06-06
  • 打赏
  • 举报
回复
Convert strings to double (atof), integer (atoi, _atoi64), or long (atol).

double atof( const char *string );

摘自msdn,
atof是将const char *string ,转换为double型,如果你将float换为double,就没问题了。

Example

/* ATOF.C: This program shows how numbers stored
* as strings can be converted to numeric values
* using the atof, atoi, and atol functions.
*/

#include <stdlib.h>
#include <stdio.h>

void main( void )
{
char *s; double x; int i; long l;

s = " -2309.12E-15"; /* Test of atof */
x = atof( s );
printf( "atof test: ASCII string: %s\tfloat: %e\n", s, x );

s = "7.8912654773d210"; /* Test of atof */
x = atof( s );
printf( "atof test: ASCII string: %s\tfloat: %e\n", s, x );

s = " -9885 pigs"; /* Test of atoi */
i = atoi( s );
printf( "atoi test: ASCII string: %s\t\tinteger: %d\n", s, i );

s = "98854 dollars"; /* Test of atol */
l = atol( s );
printf( "atol test: ASCII string: %s\t\tlong: %ld\n", s, l );
}


Output

atof test: ASCII string: -2309.12E-15 float: -2.309120e-012
atof test: ASCII string: 7.8912654773d210 float: 7.891265e+210
atoi test: ASCII string: -9885 pigs integer: -9885
atol test: ASCII string: 98854 dollars long: 98854


Data Conversion Routines | Floating


duz 2001-06-06
  • 打赏
  • 举报
回复
在我的计算机上一样,在Debug版本都是1210952.75,而在Release都是1210952.74.
如果出现不一样,最大的可能是由于ix86的计算机所有浮点计算在80x87中是80bits格式,而VC参数中传递浮点数总是用double型(64bits),所以在优化的情况下,第一个printf将直接使用atof返回的结果80bits结果转化为double型,传入printf函数,而第二次printf使用的结果只能是将atof中的结果保存如变量temp(已经被转化为float型了)然后再转化为double型传入printf.其中数据当然有可能发生少量的变化。
wenjiu5 2001-06-06
  • 打赏
  • 举报
回复
关注!
huangbeyond 2001-06-06
  • 打赏
  • 举报
回复
关注!!

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧