gpt4 book ai didi

C++ 双除以 0.0 与 DBL_MIN

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:00:35 25 4
gpt4 key购买 nike

在求 double 的平方根倒数时,将无效的非正输入限制在 0.0 或 MIN_DBL 哪个更好? (在我下面的示例中 double b 可能由于浮点舍入错误而最终为负,并且因为物理定律在游戏中略微被捏造了。)

除以 0.0 和 MIN_DBL 在游戏中产生相同的结果,因为 1/0.01/DBL_MIN 实际上是无穷大。 我的直觉告诉我 MIN_DBL 是更好的选择,但是有没有可能使用 0.0?可能像 sqrt(0.0)1/0.0和乘以 1.#INF000000000000 执行得更快,因为它们是特殊情况。

double b = 1 - v.length_squared()/(c*c);

#ifdef CLAMP_BY_0
if (b < 0.0) b = 0.0;
#endif

#ifdef CLAMP_BY_DBL_MIN
if (b <= 0.0) b = DBL_MIN;
#endif

double lorentz_factor = 1/sqrt(b);

MSVC 中的双除法:

1/0.0     = 1.#INF0000000000001/DBL_MIN = 4.4942328371557898e+307

最佳答案

在处理 float 学时,“无穷大”和“有效无穷大”是完全不同的。一旦一个数字不再是有限的,它往往会保持这种状态。因此,虽然 lorentz_factor 的值对于这两种方法“实际上”是相同的,但取决于您如何使用该值,以后的计算可能会完全不同。 sqrt(lorentz_factor) 例如,如果您限制为 0,则它会保持无限大,但如果您限制为某个非常非常小的数字,则会实际计算出来。

因此,答案在很大程度上取决于您在限制该值后打算如何处理该值。

关于C++ 双除以 0.0 与 DBL_MIN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2902511/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com