输入双精度数

时间:2011-06-23 08:15:55

标签: c algorithm floating-point

我写了一些天文程序,我已经提供了Jeffrey Sax在Meeus的书“天文算法”中实现算法的源代码。

他编写的函数之一是ReadReal(),它从用户(通过键盘或终端)获取实数。此函数的摘录如下所示:

scanf("%lf", &r);
return r * 1.000000000000001;

第二行上的常数乘法显然与舍入有关,但我看不清楚到底是什么。我已经搜索了答案,常量出现在各个站点的许多地方,但不是在这种情况下。有没有人有这方面的经验或知道这里发生了什么?这很重要吗?

感谢您的帮助。

2 个答案:

答案 0 :(得分:6)

这是指密度参数Ω,定义为宇宙的平均物质密度除以该密度的临界值。这将根据Ω是否等于,小于或大于1来选择三种可能的几何中的一种。这些被称为平坦,开放和封闭的宇宙。请查看下面的图片以获得直观表示。

Visual representation of the density parameter

您指定的Ω值是在 Big Bang Theory 中确定的,并产生所谓的平坦度问题。有关详情,请转至wiki again

要了解密度参数的重要性,请查看ultimate fate of the universe,它还可以更全面地解释Ω。

答案 1 :(得分:3)

大多数体系结构中的浮点数(使用IEEE754表示)只能表示具有有限二进制扩展的数字,即由{{1}之类的数字精确表示的数字(并且字符串的长度受浮点类型的大小限制,例如11.00100100001的53。)

任何不是这种形式的数字,即不是2的幂的有限和,例如1/3或1/5或1/10,都可以从不完全表达通过这样的浮点变量。

由于用户经常输入double之类的值,而不是更贴切的0.1,因此在您的设置中很早就会遇到这种精确性的丢失。乘以你的常数是作者在他的平台上发现的一种方式,以接近他认为用户的意图。不过,这一切都是主观的。如果您只是以0.125的短精度打印,则不应该注意到缺乏准确性。