Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript sin()Node.js和C之间的精度不同#_Javascript_C#_Node.js_Math_Trigonometry - Fatal编程技术网

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

Javascript sin()Node.js和C之间的精度不同#,javascript,c#,node.js,math,trigonometry,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代码 如何达到同样的精度 return num.ToString("G15");//0.42545176226705922 实际返回“0.425451762267059”(本例中无有效数字+

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

下面是简单的Node.js代码

var seed = 45;
var x = Math.sin(seed) * 0.5;
console.log(x);//0.4254517622670592
下面是简单的C代码

如何达到同样的精度

return num.ToString("G15");//0.42545176226705922
实际返回“0.425451762267059”(本例中无有效数字+15位小数),而不是后面注释中显示的精度

因此,您可以使用:

return num.ToString("G16");
获取“0.4254517622670592”

(例如,有效数字始终为0)
G16
将为16位小数

实际返回“0.425451762267059”(本例中无有效数字+15位小数),而不是后面注释中显示的精度

因此,您可以使用:

return num.ToString("G16");
获取“0.4254517622670592”

(例如,有效数字始终为0)
G16将是16位小数。

JavaScript类型非常复杂。看起来浮点数可能与IEEE 754-2008类似,但有些方面有待实现。见第12.7节

有一张便条

对于某些情况,toFixed的输出可能比toString更精确 值,因为toString只打印足够的有效数字 将数字与相邻的数字值区分开来。比如说,

(10000000000000128).toString()返回“10000000000000100”,而
(10000000000000128).toFixed(0)
返回“10000000000000128”

因此,要获得完整的数字精度,您需要

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.Double-tolongbits(x)
检查是否获得了相同的位模式

JavaScript类型相当复杂。看起来浮点数可能与IEEE 754-2008类似,但有些方面有待实现。见第12.7节

有一张便条

对于某些情况,toFixed的输出可能比toString更精确 值,因为toString只打印足够的有效数字 将数字与相邻的数字值区分开来。比如说,

(10000000000000128).toString()返回“10000000000000100”,而
(10000000000000128).toFixed(0)
返回“10000000000000128”

因此,要获得完整的数字精度,您需要

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.Double-tolongbits(x)
检查是否获得了相同的位模式

您正在比较两种语言将数字形式转换为字符串的结果。你到底想达到什么目的?你对“精确”感兴趣的原因到底是什么?两种语言都使用本地IEEE 754浮点。我正在尝试达到相同的精度。我无法理解你的反对票。我没有投反对票;我只是想知道你想做什么。您正在打印数值,在这两种情况下都需要将数值转换为字符串以便打印。不能保证这两种语言的规则是相同的。G14二进制结果的完整十进制表示形式是
0.4254517622670592191802541037759551080024242401123046875
类似于
G55
的结果。您正在比较这两种语言将数字形式转换为一串。你到底想达到什么目的?你对“精确”感兴趣的原因到底是什么?两种语言都使用本地IEEE 754浮点。我正在尝试达到相同的精度。我无法理解你的反对票。我没有投反对票;我只是想知道你想做什么。您正在打印数值,在这两种情况下都需要将数值转换为字符串以便打印。不能保证这两种语言的规则是相同的。G14二进制结果的完整十进制表示形式是
0.4254517622670592191802541037759551080024242401123046875
由类似
G55
的结果产生。