圆形Bug乘以简单浮点1000 * 0.01 = 9

时间:2015-01-20 22:35:54

标签: c++ gcc g++

将int与float相乘会导致使用g ++ / visual studio

的值不正确

使用double而不是float时,它总能正常工作。

计算也很简单 - 1000 * 0.01 - 应该是10 - 但是它的9。

示例程序

#include <iostream>
#include <stdio.h>

typedef unsigned long long int64;
typedef unsigned int       int32;

int main()
{
    int64 test = 1000 * 0.01f;
    printf("Test %u\n",test); // Prints 10

    int64 test2 = 1000;
    test2 = test2 * 0.01f;
    printf("Test2 %u\n",test2); // Prints 9

    int32 test3 = 1000;

    test3 = test3 * 0.01f;
    printf("Test3 %i\n",test3); // Prints 9

    int64 test4 = 1000;
    test4 = test4 * 0.01; 
    printf("Test4 %u\n",test4); // Prints 10

    int32 test5 = 1000;

    test5 = test5 * 0.01;
    printf("Test5 %i\n",test5); // Prints 10

}

输出

Test 10
Test2 9
Test3 9
Test4 10
Test5 10

使用g ++ main.cpp -o main

在Wheezy 32bit上编译 编辑:这只是过于简单了!!!

基本上我不使用0.01f

我所做的是将一个单位转换为另一个单位,例如我的一个单位是1:100到另一个单位。另一个是1:10或1:1000。

所以我基本上计算unit1 / unit2以获得正确的乘数,如果我想总和2个不同的单位。

在这种情况下,它是unit1 = 1000 unit2 = 10

所以10/1000 = 0.01 * 1000 = 10

因此,当我想将1000个unit1转换为unit2时,它应该导致10,因为基本上unit1是1000的base,而unit2是10 base。

1 个答案:

答案 0 :(得分:2)

欢迎来到浮点数的世界。这里发生的是0.01f是二进制的重复小数,因此1000 * 0.01f等于9.99999999...到我无法记住的一定数量的地方。之后,存在整数截断,因此9.9999... = 9.

为什么0.01f是重复的小数?这是浮点的解剖。 http://www.johndcook.com/blog/2009/04/06/anatomy-of-a-floating-point-number/

有关该主题的更多信息,Computerphile有一个有趣的视频。

http://www.youtube.com/watch?v=PZRI1IfStY0