将double转换为float而不使用Infinity

时间:2011-07-10 11:18:25

标签: c# types floating-point double

我使用旧的float myFloat = (float)myDouble将双倍转换为浮动。

然而,这有时会导致“无限”,这对我正在进行的进一步处理不利。只要它指向一般方向作为原始数字(我要转换的所有数字的相对数量'强度'必须保持),我对损失没问题。

如何将float转换为double并避免Infinity?

背景:
我正在从wav / mic读取字节流,将其转换为float,将其转换为double,通过FFT计算运行(这需要double),现在我想要它返回float(将数据存储在32位图像容器中)。

4 个答案:

答案 0 :(得分:33)

因此,如果该值大于float.MaxValue,您是否感到高兴为float.MaxValue?这将有效地“削减”价值观。如果没关系,那就相当容易了:

float result = (float) input;
if (float.IsPositiveInfinity(result))
{
    result = float.MaxValue;
} else if (float.IsNegativeInfinity(result))
{
    result = float.MinValue;
}

答案 1 :(得分:15)

您可以使用.NET方法Convert.ToSingle()。例如:

float newValue = Convert.ToSingle(value);

根据MSDN Documentation

  

将指定值转换为单精度浮点数。

<强>更新 经过进一步审核后,Convert.ToSingle(Double.MaxValue)会产生Infinity,因此您仍需要检查Jon Skeet的答案中的无穷大。

答案 2 :(得分:1)

如果计算的计算结果超出了您存储类型的范围,则需要执行以下三种操作之一:

  1. 抛出异常
  2. 返回一个“哨兵”值,表示存在问题,并且最好将其识别为有效地使其出现的任何计算失效
  3. 将结果固定到某个特定值(即使它没有超出数值类型的范围,它也会被挂起)。例如,可以具有带有两个时间平均输入X和Y的传感器组件,其“值”是(X * X)/(Y * Y) - (Y * Y)/(X * X)。如果输入有噪声,则可以将一个输入上的低值读取为异常低的值。如果测量将用于控制反馈回路,并且“实际”值不会超过+/- 1000000.0,那么将值固定到该范围可能比让控制回路看到一个完全疯狂的计算值更好读数(X或Y是可能的最小非零值)。

有许多应用,其中第三种方法是正确的。然而,在这种情况下,如果将读数固定为百万分之一是有意义的,那么计算结果是否为1,000,001或1E + 39(浮点+ INF)无关紧要。在任何一种情况下都应该达到一百万。

答案 3 :(得分:0)

使用此功能

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);
    }