2015-04-07 128 views
-2

http://www.cprogramming.com/tips/tip/difference-between-float-and-double来自:浮点和双精度恒定比较

在C++等任何4.12值被视为双默认情况下。 比较花车和双打可能是一个棘手的业务,因为精度差异导致微小的错误。例如:

float a = 4.12; 

if(a == 4.12) 
{ 
    cout << "hello"; 
} 
else 
{ 
    cout << "bye"; 
} 

这将显示您的输出为 “再见4.12”

为什么?

因为默认情况下4.12是双精度(例如在if语句中,或者在赋值给我们的变量时是 ),但是将其存储在浮点中会损失一些精度,因此比较double和float 导致数字精确度的微观变化 - 记住 漂浮和双打不准确。

这里有两个教训:一个是大部分时间不应该直接比较浮点数,另一个是硬编码浮点数的默认大小和类型是双精度浮点数的两倍。

事情是'你不应该做比较浮点变量和双常数'。

所以我的问题是,比较浮动变量和浮动常量,然后'f'是好的?

就是这样。

if(a == 4.12f) 
+3

呃你的问题是什么? – Turtle

+0

你问是否将一个浮点型常量与一个用双常量初始化的浮点型变量(除了f之外的浮点型常量相同)总是计算为相等?如果是这样,我认为这是一个合理的问题。 – samgak

+0

@samgak是的,确切地说。对不起,我英文很差。 –

回答

1

比较浮子可变和漂浮恒定,随后由 'f' 是OK?

这仍然是危险的。不像你float/double例如这很可能会失败的a每一个可能的值,实际上是a一个值,对于这个a == 4.12ftrue,但是这取决于你如何设置a,即使你希望它也可能不匹配4.12f。例如:

#include <iostream> 
#include <iomanip> 

int main() 
{ 
    float f = 4.14; 
    f -= 0.01; 
    f -= 0.01; 
    std::cout << std::boolalpha << (f == 4.12f) << '\n'; 
} 

ideone.com here此输出:

false 

标准并保证最近表示将在特定情况下使用,因此,如果您直接分配float a = 4.12f;然后事后a == 4.12f必然是true ,第26.5.1.4节保证,如果你流出a并将文本流式传输到另一个float,那么它们将在之后进行比较。

无论如何,如果你觉得你必须依赖这样的事情,请检查标准/文档以了解你正在考虑的具体用法。