DBL_MAX&双倍的最大值

时间:2011-04-29 01:09:29

标签: cocoa floating-point floating-accuracy

这一行:

NSLog(@"DBL_MAX: %f", DBL_MAX);

打印这个非常大的值: 17976931348623157081452742373170435679807056752584499659891747680315726078002853876058955863276687817154045895351438246423432132688946418276846754670353751698604991057655128207624549009038932894407586850845513394230458323690322294816580855933212334827479

但是,当我测试这样的双值时:

double test = 9999999999999999.0;
NSLog(@"test: %f", test);

我得到了这个意想不到的结果:

测试:10000000000000000.000000

这似乎是产生预期结果的最大位数:

double test = 999999999999999.0;
NSLog(@"test: %f", test);

测试:999999999999999.000000

我如何使用更高的阳性分数?

感谢。

2 个答案:

答案 0 :(得分:2)

不幸的是,我不能直接回答这个问题,因为我不明白你的意思是“我如何处理更高的正分数?”。

但是,我可以了解浮点数是什么,不是什么。

浮点数包括:

  • 一个标志(加号或减号)
  • 指数
  • 一个值(称为“尾数”)。

这些通常使用聪明的编码组合成32,64,80或128位。此外,一些特殊编码用于表示+ -infinity,非数字(NaN)和+ -Zero。

由于尾​​数的位数有限,因此您的值只能包含此有效位数。一个非常小的浮点数可以表示10 ^ -308和大10 ^ 308中的值。但是,任何数字只能有大约16个十进制数字。

换句话说,如果DBL_MAX与存储在变量中的信息量不对应,则打印输出。例如,没有办法表示相同的数字,但最后只有... 7480而不是...... 7479。

回到这个问题,为了说明如何表示你的价值观,你必须描述你想要代表什么样的价值观。它们是否真的是分数(即一个整数除以另一个整数),在这种情况下,您可能希望使用两个整数来表示它。如果要表示非常大的值,可能需要使用http://gmplib.org

之类的包

答案 1 :(得分:-2)

C#中的浮点不会始终产生准确的结果。有些数字不能用double,float或小数表示。您可以使用“十进制”而不是“双倍”来提高准确性,但仍不能确保所有数字都能准确表示。