0

两种语言的 sqrt 函数存在问题。

我有一个 JAVA API 和 C++ 客户端,我试图sqrt在两者中使用这些函数,但它们给我的数字略有不同。

输入是:

x = 25.0
y = 5625.0

爪哇:

double distance = Math.sqrt(x + y); 
// outputs 75.16648189186454

C++:

const double distance = std::sqrt(x + y);
// outputs 75.166481891864535

我需要这些数字与我在 API 和客户端中将它们用作种子时相同。有没有办法做到这一点?理想情况下,java输出75.16648189186454,但是,我会采取任何一个。

非常感谢

4

3 回答 3

1

当我查看来自 C++ 和 Java 的位时,它们会导致:

爪哇:

4634989787871853517

C++:

4634989787871853517

这意味着它们都是相同的位。由于它们应该遵循 IEEE-754,这意味着两种语言具有相同的值。您只是看到一个输出在一种语言中被略微截断,但值不是。

于 2019-08-18T17:25:00.390 回答
0

浮点数不准确,您不能依赖不同的实现(语言)获得完全相同的值。您也不能依靠相同的语言在不同的硬件上获得相同的价值。

序列化浮点数并在不同语言和/或硬件实现之间传输它们是一个难题(不是 N/P 难题,但仍然非常困难)。

我建议阅读这些链接以获取详细信息:

每个计算机科学家都应该知道的关于浮点运算的知识

浮点数学被破坏了吗?

有时浮点数学是完美的

于 2019-08-18T15:05:51.027 回答
0

扩展 Shawn 的评论:C++ 回复有 17 位,java 回复有 16。如果您将 17 位四舍五入,您将得到相同的结果,将 35 舍入为 4。Double 实际上略小于 16(大约 52+ 1 位乘以 log 2) 有意义的数字,因此 C++ 结果具有误导性的精确性。您可以控制在 C++ 和 Java 中显示的位数,但正如 Shawn 所说,计算机内部的实际数字是相同的。

于 2019-08-18T16:23:35.773 回答