C#数学。Acos如何预防NaN
我试图编写一个代码来回答一个包含Acos“Cos-1(a)”的数学函数,其中a是一个双精度-10.0000,快速查看将显示参数所取的值应为: 表示余弦的数字,其中d必须大于或等于-1,但小于或等于1 如上所述,C#数学。Acos如何预防NaN,c#,math,C#,Math,我试图编写一个代码来回答一个包含Acos“Cos-1(a)”的数学函数,其中a是一个双精度-10.0000,快速查看将显示参数所取的值应为: 表示余弦的数字,其中d必须大于或等于-1,但小于或等于1 如上所述,Math.Acos函数的参数必须在[-1,1]范围内。否则,结果将是NaNCos-1未定义为[-1..1] 它和Math.Acos函数无关——它可以归结为三角学。cos函数的结果不能大于1或小于-1。因此,cos函数的逆函数不能接受大于1或小于-1的参数。显然,Math.Acos为A1返回
Math.Acos
函数的参数必须在[-1,1]
范围内。否则,结果将是NaN
Cos-1未定义为[-1..1]
它和
Math.Acos
函数无关——它可以归结为三角学。cos
函数的结果不能大于1或小于-1。因此,cos
函数的逆函数不能接受大于1或小于-1的参数。显然,Math.Acos为A1返回NaN。在调用函数之前,只需排除这些值。acos的范围是-1到1,因为实际三角数学中存在限制,而不是函数或代码的问题。无论何时使用acos(),您都应该确保对值进行范围检查,或者使用其他机制确保发送到它的值始终在-1到1之间。可能您要传递的值需要首先进行规范化?您认为它应该为这些值返回一些内容的期望是不正确的
反余弦函数回答了“这个余弦的角度是多少?”。但是,对于余弦函数,没有任何值可以产生小于-1或大于1的结果。我们说它的“范围是[-1,1]”
由于没有余弦值超出此范围的角度,因此当您询问Acos
一个角度时,无法返回该角度。因此,它给出的答案是NaN
其文档也说明了这一点:
参数:
d:(System.Double)表示余弦的数字,其中d必须大于或等于-1,但小于或等于1
acos只允许范围[-1;1]内的值,因此-10自然会给出NaN。似乎没有人提供的简单答案是:
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;
}
我遇到了这个问题。我的bug是由float的精度(在javascript中)引起的。它试图学习数学。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)
}
功能acos(n){
如果(n>1){
return Math.acos(1)
}否则如果(n<-1){
返回Math.acos(-1)
}否则{
return Math.acos(n)
}
为什么A超出了[-1,1]范围?你从哪里得到这个值?没有一个真正的角度会给你一个cos或sin值超出这个范围。看起来你是在乘以cos的结果-在这种情况下,你必须在使用acos之前再次除以它。另外,不要忘记acos(cos(alpha))不一定是alpha
(cos是周期性的和全部的)。什么是整体.Ang
?大多数人不知道第1.个角为代码>意味着