将double转换为float而不使用Infinity
我使用旧的float myFloat = (float)myDouble
将double转换为float。
然而,这有时会导致“无限”,这对我正在进行的进一步处理不利。 只要它指向一般方向作为原始数字(我要转换的所有数字的相对数量’强度’必须保持),我对损失没问题。
如何将float转换为double并避免Infinity?
背景:
我正在从wav / mic读取字节流,将其转换为float
,将其转换为double
,通过FFT计算运行(这需要double
),现在我想让它恢复float
(将数据存储在32位中)图像容器)。
因此,如果该值大于float.MaxValue
,您是否满意它只是float.MaxValue
? 这将有效地“削减”价值观。 如果没关系,这很容易:
float result = (float) input; if (float.IsPositiveInfinity(result)) { result = float.MaxValue; } else if (float.IsNegativeInfinity(result)) { result = float.MinValue; }
您可以使用.NET方法Convert.ToSingle()
。 例如:
float newValue = Convert.ToSingle(value);
根据MSDN文档 :
将指定值转换为单精度浮点数。
更新:进一步审查后, Convert.ToSingle(Double.MaxValue)
产生无穷大,所以你仍然需要检查无限性,就像在Jon Skeet的答案中所做的那样。
如果计算的计算结果超出了您要存储的类型的范围,则需要执行以下三项操作之一:
- 抛出exception
- 返回一个“哨兵”值,表示存在问题,并且最好将其识别为有效地使其出现的任何计算失效
- 将结果与某个特定值挂钩(即使它没有超出数值类型的范围,它也会被挂起)。 例如,可以具有带有两个时间平均输入X和Y的传感器组件,其“值”是(X * X)/(Y * Y) – (Y * Y)/(X * X)。 如果输入有噪声,则一个输入上的低值可能被读取为exception低的值。 如果测量将用于控制反馈回路,并且“实际”值不会超过+/- 1000000.0,那么将值固定到该范围可能比让控制回路看到一个完全疯狂的计算值更好读数(X或Y是可能的最小非零值)。
在许多应用中,第三种方法是正确的。 然而,在这种情况下,如果将读数固定为百万的值是有意义的,那么计算结果是否为1,000,001或1E + 39(浮点+ INF)无关紧要。 在任何一种情况下都应该达到一百万。
使用此function
public static float DoubleToFloat(double dValue) { if (float.IsPositiveInfinity(Convert.ToSingle(dValue))) { return float.MaxValue; } if (float.IsNegativeInfinity(Convert.ToSingle(dValue))) { return float.MinValue; } return Convert.ToSingle(dValue); }