繁体   English   中英

mingw32中的double to int隐式转换

[英]Double to int implicit conversion in mingw32

我无法解释以下程序的行为(在mingw 32位上使用gcc编译)。 我知道隐式从double转换为int时可能出现的精度损失,但我希望这两种情况能够提供相同的输出,因为它执行完全相同的操作。 为什么两个输出不同?

#include <stdio.h>
#include <math.h>

int main()
{
    int table[3] = {2, 3, 4};
    int i, N;

    N = 0;
    N += table[0] * pow(100, 0);
    N += table[1] * pow(100, 1);
    N += table[2] * pow(100, 2);
    printf("%d\n", N);

    N = 0;
    for(i = 0; i < 3; i++)
        N += table[i] * pow(100, i);
    printf("%d\n", N);

    return 0;
}

//output: 
40302
40300

pow(100, 0) pow(100, 1)pow(100, 2)编译器替换常数(函数调用1, 100, 10000 ),但与pow(100, i)它必须实际调用在运行时函数(因为变量i作为参数传递),导致两个pow结果形式为0.9999999999.999999而不是1100 (或3中的任何2)。 在乘法后截断到int时,你会“失去”两个单位。

这是另一个为什么从double转换为int只是纯粹的邪恶的例子:很难在程序中找到微妙的错误(不是编译器错误)。

顺便说一句,我很惊讶O2的编译器没有展开循环,传播常量并达到相同的优化(用常量结果替换函数调用)。

Btw2 Scratch,我很惊讶编译器不仅仅用两次调用printf来替换所有代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM