相关疑难解决方法(0)

浮点数学是否破碎?

请考虑以下代码:

0.1 + 0.2 == 0.3  ->  false
Run Code Online (Sandbox Code Playgroud)
0.1 + 0.2         ->  0.30000000000000004
Run Code Online (Sandbox Code Playgroud)

为什么会出现这些不准确之处?

language-agnostic math floating-point floating-accuracy

2798
推荐指数
28
解决办法
28万
查看次数

与float和float文字相比较的奇怪输出

float f = 0.7;
if( f == 0.7 )
    printf("equal");
else
    printf("not equal");
Run Code Online (Sandbox Code Playgroud)

为什么输出not equal

为什么会这样?

c c++ floating-point double-precision

34
推荐指数
3
解决办法
6725
查看次数

浮动添加提升到双倍?

今天早上我有一个小型的WTF时刻.WTF可以概括为:

float x = 0.2f;
float y = 0.1f;
float z = x + y;
assert(z == x + y); //This assert is triggered! (Atleast with visual studio 2008)
Run Code Online (Sandbox Code Playgroud)

原因似乎是表达式x + y被提升为double并与之中的截断版本进行比较z.(如果我更改zdouble断言未触发).

我可以看到,出于精确原因,在将结果转换为单精度之前,以双精度执行所有浮点算术是有意义的.我在标准中找到了以下段落(我想我已经知道了,但在这种情况下不是这样):

4.6.1. "类型的右值float可以转换为类型的右值double.值不变"

我的问题是,x + y保证会被提升为双倍,还是由编译人员自行决定?

更新:由于许多人声称不应该使用==浮点数,我只是想说在我正在使用的特定情况下,确切的比较是合理的.

浮点比较棘手的,这里有一个关于这个主题的有趣链接,我认为还没有提到.

c++ floating-point double

12
推荐指数
2
解决办法
3301
查看次数

比较C中的相同浮点值

可能重复:
与float文件相比较的奇怪输出

当我尝试比较2个相同的float值时,它不会在以下代码中打印"相等的值":

void main()
{
    float a = 0.7;
    clrscr();
    if (a < 0.7)
        printf("value :  %f",a);
    else if (a == 0.7)
        printf("equal values");
    else
        printf("hello");
    getch();
}
Run Code Online (Sandbox Code Playgroud)

提前致谢.

c c++ floating-point floating-accuracy

7
推荐指数
1
解决办法
2万
查看次数