javascript - Node.js 和 C# 之间的 Math.sin() 精度不同

标签 javascript c# node.js math trigonometry

逗号后最后一位数字的精度有问题。与 C# 代码相比,javascript 代码生成的数字少了一位。

这是简单的 Node.js 代码

var seed = 45;
var x = Math.sin(seed) * 0.5;
console.log(x);//0.4254517622670592

这是简单的 C# 代码

public String pseudorandom()
{
    int seed = 45;
    double num = Math.Sin(seed) * (0.5);
    return num.ToString("G15");//0.42545176226705922
}

如何达到相同的精度?

最佳答案

JavaScript Number类型相当复杂。看起来 float 可能会像 IEEE 754-2008 一样,但有些方面还有待实现。请参阅http://www.ecma-international.org/ecma-262/6.0/#sec-number-objects第 12.7 节。

有一个注释

The output of toFixed may be more precise than toString for some values because toString only prints enough significant digits to distinguish the number from adjacent number values. For example,

(1000000000000000128).toString() returns "1000000000000000100", while (1000000000000000128).toFixed(0) returns "1000000000000000128".

因此,要获得完整的数字准确性,您需要类似的东西

seed = 45;
x = Math.sin(seed) * 0.5;
x.toFixed(17);
// on my platform its "0.42545176226705922"

此外,请注意有关 sin 和 cos 的实现如何允许实际算法中存在某些变化的规范。仅保证在 +/- 1 ULP 范围内。

使用java打印算法是不同的。即使强制使用 17 位数字,结果也是 0.42545176226705920。

您可以在 Java 中使用 x.toString(2)Double.doubleToLongBits(x) 检查是否获得相同的位模式。

关于javascript - Node.js 和 C# 之间的 Math.sin() 精度不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40054153/

相关文章:

javascript - 如何从异步调用返回响应?

javascript - 使用不同的元素计数对值进行分组

c# - 适用于 .NET 或 Delphi 的 ODETTE FTP (OFTP)

c# - 以高效且省时的方式构建、启动 ASP.NET Web 应用程序并运行 Microsoft CodedUI 测试

node.js - 端到端或集成或系统测试

node.js - 在 Node.js 上使用 Passport.js 和 React.js 前端进行身份验证

javascript - Gulp watch 不工作

c# - 在 C# 中搜索列表框并选择结果

sql-server - 找不到数据源名称并且没有指定nodejs的默认驱动程序

javascript - 需要帮助在 Angular 2 中将变量传递给对话框