有没有办法将来自不同语言的这两个值对齐?
Is there a way to align both these values from different languages?
两种语言的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
,但是,我会选择其中之一。
非常感谢
当我查看来自 C++ 和 Java 的部分时,它们的结果是:
爪哇岛:
4634989787871853517
C++:
4634989787871853517
这意味着它们都是相同的位。由于它们应该遵循 IEEE-754,这意味着两种语言具有相同的值。您只看到一个输出在一种语言中被略微截断,但值不是。
浮点数不精确,您不能依赖不同的实现(语言(获得完全相同的值。您也不能依赖相同的语言在不同的硬件上获得相同的价值。
序列化浮点数并在不同的语言和/或硬件嵌入之间传输它们是一个难题(不是 N/P 困难,但仍然非常困难(。
我建议阅读这些链接以获取深入的详细信息:
每个计算机科学家都应该知道的关于浮点运算的知识
浮点数学坏了吗?
有时浮点数学是完美的
扩展 Shawn 的评论:C++ 回复有 17 位数字,java 回复有 16 位。如果将 17 位数字四舍五入,您将获得相同的结果,即 35 位四舍五入为 4。Double 实际上略小于 16(大约 52+1 位乘以对数 2(的有意义数字,因此C++结果具有误导性的准确性。您可以控制在C++和Java中显示的数字数,但正如Shawn所说,计算机内部的实际数字是相同的。
相关文章:
- 为什么C++在将一个对象复制到另一个对象时需要对这两个对象进行低级常量限定
- 运行时错误:引用绑定到类型"int"的未对齐地址0xbebebebebebebec6,这需要 4 个字节对齐 (stl_vector.h)
- 简化对两个布尔值的 4 个 if/else 检查
- 如何在C++中从两个向量生成所有可能的对?
- 程序没有问 3 个问题,而是将我对第一个问题的回答用于其他两个问题
- 如何对两个 4 位数字进行乘法,将它们视为 C++ 中的多项式
- 为什么在我的实现中,所有数组都对齐到 16 个字节?
- 如何实现对参数顺序不可知的std::same_as的广义形式(即对于两个以上的类型参数)
- 如何获得比较两个向量对的子集
- 如何同时对两个或三个数组进行排序?
- gcc 中的多个对齐属性是否可以用于保证缓存行分隔?
- 将使用 4 或 8 个对齐规则将加载处理到内存中
- 在这种单例实施中,是否可以对两个商店重新排序?
- 如何在 c++ 中对两个向量进行线性搜索?
- 如何在不创建新配置的情况下对两个不同解决方案使用的一个项目使用不同的 #defines
- 有没有办法将来自不同语言的这两个值对齐?
- 对两个案例标签使用相同的值与对单个案例使用多个案例标签有什么区别?
- 如何使用排序和比较这两个函数在 c++ 中对字符数组进行排序?
- 如何在不使用两个标签的情况下对齐左侧的一些文本和右侧的一些文本
- 需要确定一个矩阵来对齐两个三角形