我正在尝试制作一个代码来回答包含Acos“Cos -1 (A)”的数学函数,其中A是双-10.0000< = A< = 10.0000 ,我在这个范围内尝试了几个数字,其中大多数都给我一个NaN作为返回,使所有的操作失败。
编辑: 正如文档所说,使用Math.Acos,我把一个数字放在范围-1< = d< = 1将返回一个NaN,我试图制作一个相同的函数,一步一步地允许这些值
答案 0 :(得分:9)
如MSDN所述,Math.Acos
函数的参数必须在[-1,1]
范围内。否则,结果将为NaN
。
答案 1 :(得分:5)
您希望它应该为这些值返回一些内容是不正确的。
反余弦函数回答了“这个余弦的角度是多少?”的问题。但是没有值可以给余弦函数产生小于-1或大于1的结果。我们说它的“范围是[-1,1]”。
由于没有超出此范围的余弦值的角度,因此当您询问Acos
时,无法给出角度。因此,它会为您提供NaN
的答案。
Math.Acos
的文档也说明了这一点:
<强>参数:强>
d :( System.Double)表示余弦的数字,其中 d 必须大于或等于-1,但小于或等于1。
答案 2 :(得分:4)
[-1 .. 1]
之外的值定义Cos -1
它与Math.Acos
函数无关 - 它归结为三角函数。 cos
函数的结果永远不会超过1或小于-1。因此,cos
函数的反函数不能采用大于1或小于-1的参数。
答案 3 :(得分:2)
快速查看documentation将显示参数所需的值应为:
表示余弦的数字,其中d必须大于或等于-1,但小于或等于1.
答案 4 :(得分:1)
显然,Math.Acos返回NaN,A <-1或A> 1。只需在调用函数之前排除这些值。
答案 5 :(得分:1)
acos仅允许范围内的值[-1; 1],所以-10自然给你NaN。
答案 6 :(得分:0)
由于实际三角函数数学的限制,acos的范围是-1到1,而不是函数或代码的问题。每当使用acos()时,你应该确保对你的值进行范围检查,或者有一些其他机制来确保传递给它的值总是在-1到1之间。也许你传递它的值需要先规范化? / p>
答案 7 :(得分:0)
您可以尝试以下方法:
Whole.Ang[n] = (Math.Pow(Whole.Long[n], 2) + Math.Pow(Whole.Long[n - 1], 2) - Math.Pow(Line1, 2)
/ (2 * Whole.Long[n] * Whole.Long[n - 1]);
if (Whole.Ang[n] > Math.PI / 2)
{
Whole.Ang[n] = Math.Asin(Math.PI / 2 - Whole.Ang[n]);
Whole.Ang[n] = Math.Round(Whole.Ang[n] * 180 / Math.PI, 0) * 2;
Whole.Ang[n] = (90 - Whole.Ang[n] * 2) + Whole.Ang[n];
Console.WriteLine("第" + (n + 1) + "个角为:" + Whole.Ang[n]);
continue;
}
else
{
Whole.Ang[n] = Math.Acos(Whole.Ang[n]);
Whole.Ang[n] = Math.Round(Whole.Ang[n] * 180 / Math.PI, 0);
Console.WriteLine("第" + (n + 1) + "个角为:" + Whole.Ang[n]);
continue;
}
答案 8 :(得分:0)
我遇到了这个问题。我的错误是由浮动精度引起的(在javascript中)。它试图使用Math.acos(1.000 ...)。只需限制范围:
function acos(n) {
if (n > 1) {
return Math.acos(1)
} else if (n < -1) {
return Math.acos(-1)
} else {
return Math.acos(n)
}
答案 9 :(得分:-1)
似乎没有人提供的简单答案是: