【发布时间】:2019-06-27 15:14:05
【问题描述】:
我有以下 c 程序,有时我运行它,输出会有所不同,具体取决于编译器和平台。我了解 double 到 int 的转换可能会导致问题。
代码如下:
//Compiler version gcc 6.3.0
#include <stdio.h>
#include <math.h>
int main(void){
double d = 2;
printf("%.20lf\n", pow(10, d));
printf("%d\n", (int)pow(10, d));
printf("%d\n", (int)pow(10, 2));
}
100是期望值,但语句
printf("%d\n", (int)pow(10, d));
当我同时使用 gcc 6.3.0 和 Windows 10 x64 时,输出为 99,但在其他情况下没有。
以下是一些结果:
//gcc 6.3.0 (Sublime Text 3) in Windows 10 x64
100.00000000000000000000
99 ->this is the problem
100
//gcc 6.3.0 in Android (using Dcoder app)
100.00000000000000000000
100
100
//MSVC(VS 2017 x86) in Windows 10 x64
100.00000000000000000000
100
100
我还测试了一些在线 gcc(6.3.0) 编译器,但所有输出都是 100。
感谢您的帮助。
【问题讨论】:
-
使用
(int)round(pow(10, d))应该修复第二个。第三个pow(10, 2)可能被优化编译器硬编码为100。 -
@user3386109:这不是that question 的重复,因为浮点格式完全能够准确地表示 100,因此错误不是由于浮点运算的特性造成的。这是由于
pow的实现不足造成的。 -
发布的代码确实存在一些语法问题。第一个是
double d = 2;试图从int初始化double。声明应为:double d = 2.0;