2014-02-07 92 views
0

我只是对某件事感到好奇。C++双/长双精度行为

我有以下代码:

if (d1 == 2.3) 
    cout << "2.3 is my value\n"; 
if (d1 == 2.2999999999999998) 
    cout << "2.2999999999999998 is my value\n"; 

VS2013 C++ 11分的截图

enter image description here

enter image description here

而且它进入这两个IFS。我知道double的精度是15decimals,所以我将不得不为这种数据使用更适合的类型。

任何人都可以链接我一个详细的参考?也是一种“方式”存储“2.3”或比2.2999999999999998更精确的数据? (长双抛出我complie错误

Error 1 error C2398: Element '1': conversion from 'long double' to 'const 
std::complex<double>::_Ty &' requires a narrowing conversion... 

感谢

编辑:增加了复杂

enter image description here

+1

尝试阅读[此问题](http://stackoverflow.com/q/16831464/315052)。另外,你是否尝试过'复杂的'? – jxh

+0

是的,我尝试了复杂的并没有编译错误,但他们两个存储仍然2.99999999999998 – blfuentes

+0

'2.3L'? ....... – jxh

回答

4

这是浮点的本质 - 有没有办法来表示2.3完全一样。一个浮点二进制。

你的第一个测试中的“2.3”不能完全用二进制表示,所以它存储为第e最接近double,即2.2999999999999998
换句话说,两个if都执行相同的比较。

+0

我知道二元问题,所以我只是想着如何处理一些“字符串”存储转换,或更大的精度类型,但长时间双重抛出我发布的错误。 – blfuentes

+2

@blacai为了能够准确地表示所有数字,您需要无限量的存储空间。你总是会在某个地方遇到极限。你可以决定你要做什么,然后自己实现,但这可能不值得。 – molbdnilo

1

也许读这可以帮助你: http://www.cplusplus.com/forum/beginner/34088/

至于我可以告诉人们似乎除非你使用的编译器没有真正的参考。尝试http://msdn.microsoft.com 我想2.2999999999999998是四舍五入到最接近的双值,这将是2.3,或者其他回答者建议的其他方式。如果你想长双文字,你需要在你的文字的末尾加上L:

//checks for equalty to a double 
if (d1 == 2.2999999999999998) 
    cout << d1 << " == 2.2999999999999998 ?\n"; 
//checks for equalty to a long double 
if (d1 == 2.2999999999999998L) 
    cout << d1 << " == 2.2999999999999998L ?\n"; 

顺便说一句:你为​​什么不使用

complex<long double> 

+0

Cplusplus论坛和教程,请不要。 Cplusplus是错误的来源,过时的做法和误解 – Manu343726

+0

正如我以前回答,我也尝试与复杂的,但它似乎与我一样'2.999999999999998' – blfuentes

+1

'2.999999999999998'是不一样的'2.999999999999998L' – mlatu