这是Math的部分运行结果:Math.Sin(10)
-0.54402111088936977
Math.Sin(1e10)
-0.48750602507627
Math.Sin(1e15)
0.85827213247637335
Math.Sin(1e20)
1.0E+20Math.Cos(10)
-0.83907152907645244
Math.Cos(100)
0.86231887228768389
Math.Cos(1e15)
-0.51319484273953742
Math.Cos(1e20)
1.0E+20我的问题是怎么为什么参数到了1e15就会返回参数值,而不是正确的sin cos结果。我想解释是这样的:
Sin(x)=Sin(y+2*k*pi)=Sin(y),cpu能计算的参数范围是0<=y<2*pi的。(之前看书上说cpu的sin指令是可以接受大于0<=y<2*pi的参数范围的)
当参数值过大的时候,就无法精确把参数处理到函数定义域之内,从而导致无法计算结果。大家觉得这样的解释是否准确?
如果不准确,正确解释是什么?Math.Sin Math.Cos等函数能正确处理的范围又是多少?

解决方案 »


  1. public static double Sin (double a)
    // 参数 a 以弧度计量的角度。 
    // 返回值 a 的正弦值。如果 a 等于 NaN、NegativeInfinity 或 PositiveInfinity,此方法将返回 NaN。
    // NaN 表示不是数字 (NaN) 的值。此字段为常数。 此常数的值是零被零除所得到的结果。
    //     当运算结果未定义时返回此常数。使用 IsNaN 确定值是否为非数字。不可能通过将某个值与另一个等于 NaN 的值进行比较来确定该值是否不是数字。// NegativeInfinity 表示负无穷。此字段为常数。此常数的值是负数被零除所得到的结果。当运算结果小于 MinValue 时,返回此常数。// PositiveInfinity  表示正无穷。此字段为常数。此常数的值是正数被零除所得到的结果。当运算结果大于 MaxValue 时,返回此常数。
      

  2. Math.Cos 
    范围从约 -9223372036854775295 至约 9223372036854775295。超出此范围的值,Cos 返回未更改的参数
      

  3. 请看在线 msdn 的说明:
    http://msdn.microsoft.com/zh-cn/library/system.math.sin.aspx
    .NET Framework 类库
    Math.Sin 方法 返回指定角度的正弦值。 备注 角度 a 必须用弧度表示。乘以 Math.PI/180 将角度转换成弧度。 d 的可接受值的范围从约 -9223372036854775295 至约 9223372036854775295。对于超出此范围的值,Sin 方法返回未更改的 d,而不是引发异常。
      

  4. 空军说的很清楚了,在MATH类这几个函数处理方式上,出现溢出情况是直接返回原参数,而不是报非法异常。
    不过不清楚MS这样设计的意图是什么
      

  5. 可能是由于在科学计算里溢出部分有时是要忽略的这么写方便点吧0<=|t-sin(t)|<=sin(t)
    t太小|t-sin(t)|直接忽略不计,瞎猜的
      

  6. 看看msdn 2楼4楼说的很清楚
      

类似问题 »