Reputation: 12314
I'm converting double to float using ye old float myFloat = (float)myDouble
.
This does however sometimes result in "Infinity", which is not good for the further processing I'm doing. I'm okay with loss as long as it is pointing in the general direction as the original number (the relative number 'strength' on all numbers I'm converting must be maintained).
How can I convert float to double and avoid Infinity?
Background:
I'm reading a bytestream from wav/mic, converting it to float
, converting it to double
, running it through FFT calculation (this is what requires double
), and now I want it back to float
(storing the data in 32-bit image container).
Upvotes: 29
Views: 95649
Reputation: 1
Use this 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);
}
Upvotes: 0
Reputation: 8563
You can use the .NET method Convert.ToSingle()
. For example:
float newValue = Convert.ToSingle(value);
According to the MSDN Documentation:
Converts a specified value to a single-precision floating-point number.
Update:
Upon further review, Convert.ToSingle(Double.MaxValue)
results in Infinity so you still have to check for infinity as done in Jon Skeet's answer.
Upvotes: 17
Reputation: 81159
If a calculation result of a calculation exceeds the range of the type you're storing it in, it will be necessary to do one of three things:
There are many applications where the third approach would be the right one. In such situations, however, if it would make sense to peg the reading at a value of a million, then it shouldn't matter whether the computation results in a value of 1,000,001 or 1E+39 (floating-point +INF). One should peg to a million in either case.
Upvotes: 1
Reputation: 1500515
So if the value is greater than float.MaxValue
, are you happy for it to just be float.MaxValue
? That will effectively "clip" the values. If that's okay, it's reasonably easy:
float result = (float) input;
if (float.IsPositiveInfinity(result))
{
result = float.MaxValue;
} else if (float.IsNegativeInfinity(result))
{
result = float.MinValue;
}
Upvotes: 36