【发布时间】:2016-02-25 01:11:44
【问题描述】:
我最近遇到了非规范化定义,我了解到有些数字无法以规范化形式表示,因为它们太小而无法适应其相应的类型。根据 IEEE
所以我试图做的是在非规范化数字作为参数传递时捕获,以避免使用这些数字进行计算。如果我理解正确,我只需要查找非规范化范围内的数字
private bool IsDenormalizedNumber(float number)
{
return Math.Pow(2, -149) <= number && number<= ((2-Math.Pow(2,-23))*Math.Pow(2, -127)) ||
Math.Pow(-2, -149) <= number && number<= -((2 - Math.Pow(2, -23)) * Math.Pow(2, -127));
}
我的解释正确吗?
【问题讨论】:
-
似乎是接近它的正确方法。但是,您的公式与定义不匹配:
return Math.Pow(2, -149) <= number && number<= ((1-Math.Pow(2,-23))*Math.Pow(2, -126)) || Math.Pow(-2, -149) >= number && number >= -((1 - Math.Pow(2, -23)) * Math.Pow(2, -126)) -
您使用
double计算和<=运算符进行比较对我来说是错误的。我认为比钓鱼嘉年华还有更多的选角,这可能会使这些比较失败。 -
那么,您认为我会因为 double 和 float 的不同格式而得到错误的比较吗?
-
当您的数学模型开始生成无意义的和不准确的数字时,等待是没有意义的。如果你正在计算一个物理属性,比如长度,那么你在它小于原子直径之前就按下了紧急停止按钮。这是1E-10,没有意义让一直到1E-38。如果您不知道数学模型的实用 范围,请询问创建它的人来添加它们。就像您需要知道计算的准确性一样。 float 只有 6 位有效数字,如果计算复杂,则可能没有剩余。
-
@Nandhi 我询问字节序的原因是
BitConverter将假定传入字节的特定字节序,可以通过检查BitConverter.IsLittleEndian找到。在转换为 .NET 类型之前,您需要确保注意不要让字节顺序错误,否则您会得到错误的答案(不确定您是否已经这样做了)。直接位掩码字节而不涉及 .NET 类型系统及其复杂性会更简单、更高效。
标签: c#