相关疑难解决方法(0)

如果存储在中间"双"变量中,浮点计算会发生变化

我正在尝试编写一个简单的log base 2方法.我知道在计算机上表示像std :: log(8.0)和std :: log(2.0)这样的东西很困难.我也理解std :: log(8.0)/ std :: log(2.0)可能会导致一个非常低于3.0的值.我不明白的是为什么将下面的计算结果放入一个double并使其成为左值然后将其转换为unsigned int会比直接转换公式更改结果.下面的代码显示我的测试用例在我的32位debian wheezy机器上反复失败,但在我的64位debian wheezy机器上反复传递.

#include <cmath>
#include "assert.h"

int main () {
  int n = 8;
  unsigned int i =
    static_cast<unsigned int>(std::log(static_cast<double>(n)) /
                              std::log(static_cast<double>(2)));
  double d =
    std::log(static_cast<double>(n)) / std::log(static_cast<double>(2));
  unsigned int j = static_cast<unsigned int> (d);
  assert (i == j);
}
Run Code Online (Sandbox Code Playgroud)

我也知道我可以使用位移来以更可预测的方式得出我的结果.我很好奇为什么要运行double导致操作与操作有任何不同,而不是将该值粘贴到堆栈中的double并在堆栈上转换double.

c++ floating-point double floating-accuracy

3
推荐指数
1
解决办法
192
查看次数

为什么我的天文模拟不准确?

我制作了一个模拟太阳系中物体运动的程序,然而,我的结果却出现了各种不准确之处.

我相信它可能与我的集成方法有关.


tl; dr我的模拟和NASA数据之间的地球位置和速度之间有细微差别,如果你可以请看下面我的代码并告诉我数学是否错误.


我跑的测试是一个10天长(864000秒)的模拟,从开始到Thu Mar 13 18:30:59 2006结束Thu Mar 23 18:30:59 2006.

模拟结束后,该计划报告了地球的以下统计数据:

Earth position: (-1.48934630382e+11, -7437423391.22)
Earth velocity: (990.996767368, -29867.6967867)
Run Code Online (Sandbox Code Playgroud)

测量单位当然是米和米每秒.

我已经使用HORIZONS系统来获取Thu Mar 13 18:30:59 2006太阳系中大多数大型物体的起始位置和速度矢量,并将它们放入模拟中.

测试结束后,我再次查询HORIZONS的Thu Mar 23 18:30:59 2006地球数据,得到了以下结果:

Earth position: (-1.489348720130393E+11, -7437325664.023257)
Earth velocity: (990.4160633376971, -2986.736541327986)
Run Code Online (Sandbox Code Playgroud)

如您所见,结果的前四位数几乎总是相同.然而,这仍然是一个非常大的错过!我很担心,因为我将不得不模拟几年的时间,错误可能会升级.

你能看看我模拟的核心,告诉我我的数学是不正确的吗?

def update (self, dt):
    """Pushes the uni 'dt' seconds forward in time."""

    self.time += dt

    for b1, b2 in combinations(self.bodies.values(), 2):
        fg = self.Fg(b1, b2)

        if b1.position.x > b2.position.x: …
Run Code Online (Sandbox Code Playgroud)

python simulation floating-point astronomy

2
推荐指数
1
解决办法
562
查看次数