【发布时间】:2015-04-30 08:33:39
【问题描述】:
我正在阅读this。它包含以下 C 程序。
#include<stdio.h>
int main()
{
float x = 0.1;
if (x == 0.1)
printf("IF");
else if (x == 0.1f)
printf("ELSE IF");
else
printf("ELSE");
}
文章说
上述程序的输出是“ELSE IF”,意思是表达式“x == 0.1″ 返回 false,表达式“x == 0.1f” 返回 true。
但我在不同的编译器上尝试过并得到不同的输出:
这是各种 IDE 上的输出。
1) Orwell Dev C++: ELSE
2) 代码块 13.12: ELSE IF 但在编译期间会给出以下警告。
警告:将浮点数与 == 或 != 进行比较是不安全的。
为什么这种比较不安全?
3) Ideone.com:ELSE IF(见运行:http://ideone.com/VOE3E0)
4) TDM GCC 32 位:ELSE IF
5) MSVS 2010:ELSE IF 但编译时出现警告
警告 1 警告 C4305:“正在初始化”:从“双”截断到 '浮动'
这里到底发生了什么?程序有什么问题?是否发生了实现定义的行为?
请帮帮我。
【问题讨论】:
-
从技术上讲,一些编译器执行从 double 到 float 的转换,而一些(输出
ELSE的编译器)只是裁剪按位表示。应该是这样。输出ELSE的编译器是错误的,恕我直言 -
我不认为这是重复的:这个问题是指比较
float和double:这是关于比较float和文字。
标签: c floating-point floating-accuracy floating-point-conversion