以下は、通常の最も近い丸めモードで一般的な(一部の例外を除いて)標準のIEEE-754浮動小数点演算を使用していることを前提としています。
double値がfloat値の通常の範囲内にある場合、doubleがfloatに丸められるときに発生する唯一の変更は、仮数(値の小数部分)が53ビットから24ビットに丸められることです。これにより、最大で1/2 ULP(最小精度の単位)のエラーが発生します。フロートのULPは、フロートより大きくない2の最大累乗の2〜23倍です。たとえば、フロートが7.25の場合、2の最大の累乗は4以下であるため、そのULPは4 * 2 -23 = 2 -21、約4.77e-7です。したがって、区間[4、8)のdoubleがfloatに変換されるときの誤差は、最大で2 -22、約2.38e-7です。別の例として、フロートが約.03の場合、2の最大の累乗は2-6以下です。、したがって、ULPは2 -29であり、doubleに変換するときの最大エラーは2-30です。
これらは絶対的なエラーです。相対誤差は2-24未満です。これは、1/2 ULPを可能な最小値で割ったものです(特定のULPの間隔内の最小値、つまり2の累乗で境界を定めます)。たとえば、[4、8)の各数値xについて、数値は少なくとも4であり、誤差は最大で2 -22であることがわかっているため、相対誤差は最大で2 -22/4 = 2-24です。(2の正確な累乗をfloatからdoubleに変換するときにエラーがないため、エラーを正確に2〜24にすることはできません。したがって、xが4より大きい場合にのみエラーが発生し、相対エラーは以下になります。 、2 -24。)変換される値について詳しく知っている場合、たとえば、値が4よりも8に近い場合は、エラーをより厳密に制限できます。
数値がフロートの通常の範囲外である場合、エラーが大きくなる可能性があります。最大の有限浮動小数点値は2128-2 104、約3.40e38です。1/2 ULP(floatの; doublesはより細かいULP)であるdoubleをfloatに変換すると、無限大が返されます。これは、もちろん、無限の絶対誤差と無限の相対誤差です。(最大有限フロートよりも大きいが、1/2 ULP未満のdoubleは、最大有限フロートに変換され、前の段落で説明したのと同じエラーが発生します。)
最小の正の通常のフロートは2-126、約1.18e-38です。これ(両端を含む)の1/2 ULP以内の数値はそれに変換されますが、それ未満の数値は、ULPが2-149に固定されている特別な非正規化形式に変換されます。絶対誤差は最大で1/2ULP、2-150になります。相対誤差は、変換される値に大きく依存します。
上記は正の数について説明しています。負の数の誤差は対称的です。
doubleの値をfloatとして正確に表すことができれば、変換にエラーはありません。
入力番号を新しい間隔にマッピングすると、特定の状況でのエラーを減らすことができます。不自然な例として、すべての数値が区間[ 2 48、2 48 +2 24 )の整数であると仮定します。次に、それらをfloatに変換すると、値を区別するすべての情報が失われます。それらはすべて248に変換されます。ただし、それらを[0、2 24)にマッピングすると、すべての情報が保持されます。それぞれの異なる入力は、異なる結果に変換されます。
どのマップが目的に最も適しているかは、特定の状況によって異なります。