gpt4 book ai didi

C++ 意外的 NaN

转载 作者:太空宇宙 更新时间:2023-11-04 15:20:42 25 4
gpt4 key购买 nike

我现在正在编写一个项目工作,我最近的问题是一段时间后输出给出 NaN(当然,然后持续),但由于我有限的知识,我无法弄清楚为什么。我阅读了一些有关 NaN 通常来自何处(0/0、inf*0 等)的信息,但这里似乎并非如此。虽然整个代码太长太复杂,无法在此处发布,但我已经确定了它似乎来自的代码部分:

long double force_dipol(particle &part1, particle &part2, long double distance) {
if ((abstand(part1.dummyd)!=0) && (abstand(part2.dummyd)!=0) { //Division checks
long double ret;
ret = 3.*( part1.dummyd[0]*part2.dummyd[0] + part1.dummyd[1]*part2.dummyd[1] + part1.dummyd[2]*part2.dummyd[2] ) / mypow(distance, 3);
ret -= 9.*abstand(part1.dummyd)*abstand(part2.dummyd) / mypow(distance, 3) * (part1.dummyd[2]/abstand(part1.dummyd) * part2.dummyd[2]/abstand(part2.dummyd));
return ret;
}
}

对于任何关心的人来说,它是偶极-偶极相互作用的力项(是的,物理学!)。

  • 粒子是我的结构,它只是将变量放在一起。
  • dummyd 是一个 [3]-Array,它是偶极矩,其分量范围从大约 -5 到 5,最大值
  • abstand() 是 vector 范数,从数学上讲,abstand(dummyd) 介于 0.6 和 2.5 之间
  • 距离范围从 2.4 到 5.6
  • mypow() 只是为了性能而定制的 pow()
  • 3. 和 9. 是数字 XP
  • 所有使用的变量都是long double

此外,如果我注释掉函数的第一项(long double ret 下面的行),它似乎停止了 NaN'ing,而第二项(之后的行,越长一)似乎工作。

上面的函数是整个算法的一部分,总共迭代了几百万次;沿线的某处,位置和动量数组(使用此函数)的输出开始仅获得 NaN 并保持在那里。实际过滤输出需要大量工作,但到目前为止,它似乎是从正常值(即在预期范围内,离大数字还差得很远)得到的。

现在,我想了解为什么在这种情况下会得到 NaN,以及如何解决它。任何可以向我解释的人都会获得 +10 的敬畏度。

最佳答案

if 条件失败时,您不会返回任何东西。如果您使用“返回”值,这将导致未定义的行为。

关于C++ 意外的 NaN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19997157/

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