双倍的 Pow 实现

2024-04-13

我正在开发一个用于运动控制的代码,但我遇到了 pow 函数的问题。 我使用VS2010作为IDE。

这是我的问题: 我有:

    double p = 100.0000;
    double d = 1000.0000;
    t1 = pow((p/(8.0000*d),1.00/4.000);

在评估最后一个函数时,我没有得到更好的近似结果。我得到了正确的小数点后 7 位,而后面的数字都是垃圾。 我猜测 pow 函数仅将任何输入变量转换为 float 并进行计算。

  1. 我对吗?
  2. 如果是这样,是否有任何代码可以让我得到“启发”来重新实现 pow 以获得更好的精度?

编辑:已解决。

毕竟,我遇到了 FPU 配置位问题,这是由 OGRE 3D 框架使用的 Direct3D 引起的。

如果使用 OGRE,在配置 GUI 上,只需设置“浮点模式=一致”。

如果使用原始 Direct3D,则在调用 CreateDevice 时,请确保将“D3DCREATE_FPU_PRESERVE”标志传递给它。

原帖:

您可能正在使用一个正在更改默认精度的库 FPU 为单精度。然后所有浮点运算,甚至 对于双精度数,实际上将作为单精度运算执行。

作为测试,您可以尝试调用 _controlfp( _CW_DEFAULT, 0xfffff ); (您需要包括)在执行计算之前 看看你是否得到正确的结果。这将重置浮点 控制字为默认值。请注意,它将重置其他设置 以及,这可能会导致问题。

改变浮点精度的一种常见库是 Direct3D 9(也许还有其他版本):默认情况下,它会更改 创建设备时将 FPU 转换为单精度。如果您使用它,请指定 创建设备时使用标志 D3DCREATE_FPU_PRESERVE 来阻止它 改变FPU精度。


您可能正在使用将 FPU 的默认精度更改为单精度的库。然后所有浮点运算,即使是doubles,实际上将作为单精度运算执行。

作为测试,您可以尝试调用_controlfp( _CW_DEFAULT, 0xfffff );(你需要包括<float.h>)在执行计算之前看看是否得到正确的结果。这会将浮点控制字重置为默认值。请注意,它也会重置其他设置,这可能会导致问题。

更改浮点精度的一个常见库是 Direct3D 9(可能还有其他版本):默认情况下,它在创建设备时将 FPU 更改为单精度。如果使用它,请指定标志D3DCREATE_FPU_PRESERVE创建设备时防止其更改 FPU 精度。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

双倍的 Pow 实现 的相关文章

随机推荐