首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >mingw32中双精度到整型的隐式转换

mingw32中双精度到整型的隐式转换
EN

Stack Overflow用户
提问于 2014-12-08 00:49:37
回答 1查看 448关注 0票数 19

我不能解释下面这个程序的行为(用明文32位的gcc编译的)。我知道从double隐式转换为int时可能会造成精度损失,但我希望这两种情况会给出相同的输出,因为它执行的是完全相同的操作。为什么这两个输出是不同的?

代码语言:javascript
复制
#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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-12-08 01:45:32

对于pow(100, 0) pow(100, 1)pow(100, 2),编译器将函数调用替换为常量(1, 100, 10000),但对于pow(100, i),它必须在运行时实际调用函数(因为变量i被作为参数传递),从而导致pow的两个结果以0.9999999999.999999的形式出现,而不是1100 (或这三个中的任意两个)。当在乘法后截断为int时,你会“丢失”两个单元。

这是另一个例子,说明了为什么从double转换到int只是纯粹邪恶的:在你的程序中很难找到细微的bug(不是编译器的bug)。

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

我很惊讶编译器没有仅仅用两次对printf的调用来替换你所有的代码。

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27345080

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档