「4.2.3. 浮動小数点型と書式と値」の編集履歴(バックアップ)一覧はこちら

4.2.3. 浮動小数点型と書式と値」(2012/09/10 (月) 09:25:29) の最新版変更点

追加された行は緑色になります。

削除された行は赤色になります。

*[[4. 型と値と変数]] **[[4.1. 型と変数の種類]] **[[4.2. プリミティブ型と値]] ***[[4.2.1. 整数型と値]] ***[[4.2.2. 整数演算]] ***4.2.3. 浮動小数点型と書式と値 浮動小数点型(floating-point type)には&tt(){float}、&tt(){double}があり、それぞれが&i(){2進浮動小数点計算のためのIEEE規格}、ANSI/IEEE規格754-2008(IEEE, New York)、で規定する単精度32ビット、倍精度64ビット形式のIEEE754値および演算に概念的に関連づいています。 IEEE754規格には符号と数の大きさからなる正と負の数だけでなく正と負のゼロ、正と負の&i(){無限大}、特別な&i(){非数値}(Not-a-Number、以降NaN)も含まれています。NaN値はゼロ割るゼロ等の無効な演算の結果を表すのに利用されます。NaNは&tt(){Float.NaN}や&tt(){Double.NaN}として&tt(){float}型にも&tt(){double}型にもそれぞれ組み込まれています。 Javaプログラミング言語のどの実装も浮動小数点値の2つの標準集合、&i(){float値集合}と&i(){double値集合}をサポートしています。加えて、Javaプログラミング言語の実装は、&i(){float拡張指数値集合}や&i(){double拡張指数値集合}と呼ばれる2つの拡張指数集合の片方もしくは両方を任意でサポートします。この拡張指数値集合は、特定の環境下で、標準値集合の代わりに&tt(){float}や&tt(){double}型の式の値を表すのにしようされます([[5.1.13.>5.1.13. 値集合変換]]、[[15.4.>15.4. FP厳密式]])。 任意の浮動小数点値集合の有限非ゼロ値は全て&i(){s・m・2&sup(){(e - N + 1)}}の形で表されます。ここで、&i(){s}は+1もしくは-1、&i(){m}は2&sup(){&i(){N}}未満の正の整数、&i(){e}は&i(){E&sub(){min}} = -(2&sup(){&i(){K}-1}-2)以上&i(){E&sub(){max}}=(2&sup(){&i(){K}-1}-1)以下の整数で、&i(){N}と&i(){K}は値集合に依存するパラメーターです。値によってはこの形式内で複数の形で表すことができます。例えば、値集合内の値&i(){v}を適当な&i(){s}、&i(){m}、&i(){e}を使って表したとします。次に&i(){m}は偶数で&i(){e}は2&sup(){&i(){K}-1}未満ならば、半分の&i(){m}と&i(){e}に1を足すことで同一の値vを第2の形で表すことができます。&i(){m}≧2&sup(){&i(){N}-1}の時、この形式の表現を&i(){正規化されている(normalized)}と呼びます。そうでなければ&i(){非正規化されている(denormalized)}と呼びます。値集合の値が&i(){m}≧2&sup(){&i(){N}-1}の形で表せない場合、正規化表現を持たないことから、非正規化値と呼びます。 2つの必須の浮動小数点値集合とオプションの2つの浮動小数点値集合について、パラメーター&i(){N}と&i(){K}(およびそれから導出されるパラメーター&i(){E&sub(){min}}と&i(){E&sub(){max}})の条件を表4.1.にまとめます。 &bold(){表4.1. 浮動小数点値集合パラメーター} |&bold(){パラメーター}|&bold(){float}|&bold(){float拡張指数}|&bold(){double}|&bold(){double拡張指数}| |&i(){N}|24|24|53|53| |&i(){K}|8|≧11|11|≧15| |&i(){E&sub(){max}}|+127|≧+1023|+1023|≧+16363| |&i(){E&sub(){min}}|-126|≦-1022|-1022|≦-16382| 片方もしくは両方の拡張指数値集合が実装でサポートされている時、サポートされている拡張指数値集合のそれぞれに対して特別な実装依存定数&i(){K}があります。この値は表4.1.の条件を満たし、そして&i(){K}は&i(){E&sub(){min}}と&i(){E&sub(){max}}に影響を及ぼす。 4つの値集合のどれも上記で記述した有限非ゼロ値だけでなくNaN値や正のゼロ、負のゼロ、正の無限大、負の無限大の4つの値を含んでいます。 表4.1.はfloat値集合の全要素はfloat拡張指数値集合、double値集合、double拡張指数値集合の要素でもあることが条件であるように設計されています。同様に、double値集合の各要素はdouble拡張指数値集合の要素でもあることも条件です。どの拡張指数値集合も対応する標準値集合より指数範囲は大きくなっていますが、精度は同じです。 float値集合の要素はIEEE754規格で定義されている単精度浮動小数点形式を使って表せる値と正確に同じです。double値集合の要素はIEEE754規格で定義されている倍精度浮動小数点形式を使って表せる値と正確に同じです。ただし、float拡張指数値集合とdouble拡張指数値集合の要素はIEEE754単精度拡張形式や倍精度拡張形式を使って表せる値とは一致しません。 float、float拡張指数、double、double拡張指数値集合は型ではありません。Javaプログラミング言語の実装が&tt(){float}型の値を表すためにfloat値集合の要素を用いるのは常に正しいことです。しかしながら、実装のある領域でfloat拡張指数値集合の要素を代わりに用いるのは許されています。同様に、実装が&tt(){double}型の値を表すためにdouble値集合の要素を用いるのは常に正しいことです。しかしながら、実装のある領域でdouble拡張指数値集合の要素を代わりに用いるのは許されています。 NaNを除いて、浮動小数点値は&i(){順序づけられて}います。小さいものから大きなものへ、負の無限大、負の有限非ゼロ値、正と負のゼロ、正の非有限ゼロ値、正の無限大という順序です。 IEEE754は単精度、倍精度浮動小数点形式のいずれにおいても複数の異なるNaN値を持つことを認めています。個々のハードウェアアーキテクチャーによって新たなNaNの発生に対してNaNがある特定のビットパターンを返すと決まっているとしても、例えば遡及的診断情報(retrospectivge diagnostic information)を符号化するために、プログラマーは異なるビットパターンのNaNを作成することができます。 大抵、Java SEプラットフォームは与えられた型のNaN値をあたかも単一の正規化値にまとめてられているように扱います。よって本仕様では通常、任意のNaNをあたかも1つの正規化値のように参照します。 &i(){&small(){しかしながら、Java SEプラットフォームのバージョン1.3でプログラマーがNaN値の違いを区別できるようなメソッドが導入されました。&tt(){Float.floatToRawIntBits}と&tt(){Double.doubleToRawLongBits}メソッドです。更なる情報に興味のある読者は&tt(){Float}や&tt(){Double}クラスの仕様を参照してください。}} 正のゼロと負のゼロを比較する場合それらは等価です。よって、式&tt(){0.0==-0.0}の結果は&tt(){true}であり&tt(){0.0>-0.0}の結果は&tt(){false}です。しかし他の演算では正のゼロと負のゼロは区別されます。例えば、&tt(){1.0/0.0}の値は正の無限大ですが、&tt(){1.0/-0.0}は負の無限大です。 NaNは&i(){順序付けされない}ので、以下が成り立ちます。: -&link(数値比較演算子<と<=と>と>=){15.20.1. 数値比較演算子<と<=と>と>=}は一方もしくは両方のオペランドがNaNであれば&tt(){false}を返します。 -等価演算子==は一方のオペランドがNaNであれば&tt(){false}を返します。   特に、&tt(){(x<y) == !(x>=y)}は&tt(){x}か&tt(){y}の一方がNaNであれば&tt(){false}です。 -不等価演算子!=は一方のオペランドがNaNであれば&tt(){true}を返します。   特に、&tt(){x!=x}は&tt(){x}がNaNである場合のみ&tt(){true}を返します。 ***[[4.2.4. 浮動小数点演算]] ***[[4.2.5. ブール型とブール値]] **[[4.3. 参照型と値]] **[[4.4. 型変数]] **[[4.5. 引数付き型]] **[[4.6. 型の抹消]] **[[4.7. 具象可能型]] **[[4.8. 未加工型]] **[[4.9. 交差型]] **[[4.10. 型の派生]] **[[4.11. 型の使用箇所]] **[[4.12. 変数]]
*[[4. 型と値と変数]] **[[4.1. 型と変数の種類]] **[[4.2. プリミティブ型と値]] ***[[4.2.1. 整数型と値]] ***[[4.2.2. 整数演算]] ***4.2.3. 浮動小数点型と書式と値 浮動小数点型(floating-point type)には&tt(){float}、&tt(){double}があり、それぞれが&i(){2進浮動小数点計算のためのIEEE規格}、ANSI/IEEE規格754-2008(IEEE, New York)、で規定する単精度32ビット、倍精度64ビット形式のIEEE754値および演算に概念的に関連づいています。 IEEE754規格には符号と数の大きさからなる正と負の数だけでなく正と負のゼロ、正と負の&i(){無限大}、特別な&i(){非数値}(Not-a-Number、以降NaN)も含まれています。NaN値はゼロ割るゼロ等の無効な演算の結果を表すのに利用されます。NaNは&tt(){Float.NaN}や&tt(){Double.NaN}として&tt(){float}型にも&tt(){double}型にもそれぞれ組み込まれています。 Javaプログラミング言語のどの実装も浮動小数点値の2つの標準集合、&i(){float値集合}と&i(){double値集合}をサポートしています。加えて、Javaプログラミング言語の実装は、&i(){float拡張指数値集合}や&i(){double拡張指数値集合}と呼ばれる2つの拡張指数集合の片方もしくは両方を任意でサポートします。この拡張指数値集合は、特定の環境下で、標準値集合の代わりに&tt(){float}や&tt(){double}型の式の値を表すのにしようされます([[5.1.13.>5.1.13. 値集合変換]]、[[15.4.>15.4. FP厳密式]])。 任意の浮動小数点値集合の有限非ゼロ値は全て&i(){s・m・2&sup(){(e - N + 1)}}の形で表されます。ここで、&i(){s}は+1もしくは-1、&i(){m}は2&sup(){&i(){N}}未満の正の整数、&i(){e}は&i(){E&sub(){min}} = -(2&sup(){&i(){K}-1}-2)以上&i(){E&sub(){max}}=(2&sup(){&i(){K}-1}-1)以下の整数で、&i(){N}と&i(){K}は値集合に依存するパラメーターです。値によってはこの形式内で複数の形で表すことができます。例えば、値集合内の値&i(){v}を適当な&i(){s}、&i(){m}、&i(){e}を使って表したとします。次に&i(){m}は偶数で&i(){e}は2&sup(){&i(){K}-1}未満ならば、半分の&i(){m}と&i(){e}に1を足すことで同一の値vを第2の形で表すことができます。&i(){m}≧2&sup(){&i(){N}-1}の時、この形式の表現を&i(){正規化されている(normalized)}と呼びます。そうでなければ&i(){非正規化されている(denormalized)}と呼びます。値集合の値が&i(){m}≧2&sup(){&i(){N}-1}の形で表せない場合、正規化表現を持たないことから、非正規化値と呼びます。 2つの必須の浮動小数点値集合とオプションの2つの浮動小数点値集合について、パラメーター&i(){N}と&i(){K}(およびそれから導出されるパラメーター&i(){E&sub(){min}}と&i(){E&sub(){max}})の条件を表4.1.にまとめます。 &bold(){表4.1. 浮動小数点値集合パラメーター} |&bold(){パラメーター}|&bold(){float}|&bold(){float拡張指数}|&bold(){double}|&bold(){double拡張指数}| |&i(){N}|24|24|53|53| |&i(){K}|8|≧11|11|≧15| |&i(){E&sub(){max}}|+127|≧+1023|+1023|≧+16363| |&i(){E&sub(){min}}|-126|≦-1022|-1022|≦-16382| 片方もしくは両方の拡張指数値集合が実装でサポートされている時、サポートされている拡張指数値集合のそれぞれに対して特別な実装依存定数&i(){K}があります。この値は表4.1.の条件を満たし、そして&i(){K}は&i(){E&sub(){min}}と&i(){E&sub(){max}}に影響を及ぼす。 4つの値集合のどれも上記で記述した有限非ゼロ値だけでなくNaN値や正のゼロ、負のゼロ、正の無限大、負の無限大の4つの値を含んでいます。 表4.1.はfloat値集合の全要素はfloat拡張指数値集合、double値集合、double拡張指数値集合の要素でもあることが条件であるように設計されています。同様に、double値集合の各要素はdouble拡張指数値集合の要素でもあることも条件です。どの拡張指数値集合も対応する標準値集合より指数範囲は大きくなっていますが、精度は同じです。 float値集合の要素はIEEE754規格で定義されている単精度浮動小数点形式を使って表せる値と正確に同じです。double値集合の要素はIEEE754規格で定義されている倍精度浮動小数点形式を使って表せる値と正確に同じです。ただし、float拡張指数値集合とdouble拡張指数値集合の要素はIEEE754単精度拡張形式や倍精度拡張形式を使って表せる値とは一致しません。 float、float拡張指数、double、double拡張指数値集合は型ではありません。Javaプログラミング言語の実装が&tt(){float}型の値を表すためにfloat値集合の要素を用いるのは常に正しいことです。しかしながら、実装のある領域でfloat拡張指数値集合の要素を代わりに用いるのは許されています。同様に、実装が&tt(){double}型の値を表すためにdouble値集合の要素を用いるのは常に正しいことです。しかしながら、実装のある領域でdouble拡張指数値集合の要素を代わりに用いるのは許されています。 NaNを除いて、浮動小数点値は&i(){順序づけられて}います。小さいものから大きなものへ、負の無限大、負の有限非ゼロ値、正と負のゼロ、正の非有限ゼロ値、正の無限大という順序です。 IEEE754は単精度、倍精度浮動小数点形式のいずれにおいても複数の異なるNaN値を持つことを認めています。個々のハードウェアアーキテクチャーによって新たなNaNの発生に対してNaNがある特定のビットパターンを返すと決まっているとしても、例えば遡及的診断情報(retrospectivge diagnostic information)を符号化するために、プログラマーは異なるビットパターンのNaNを作成することができます。 大抵、Java SEプラットフォームは与えられた型のNaN値をあたかも単一の正規化値にまとめてられているように扱います。よって本仕様では通常、任意のNaNをあたかも1つの正規化値のように参照します。 &i(){&small(){しかしながら、Java SEプラットフォームのバージョン1.3でプログラマーがNaN値の違いを区別できるようなメソッドが導入されました。&tt(){Float.floatToRawIntBits}と&tt(){Double.doubleToRawLongBits}メソッドです。更なる情報に興味のある読者は&tt(){Float}や&tt(){Double}クラスの仕様を参照してください。}} 正のゼロと負のゼロを比較する場合それらは等価です。よって、式&tt(){0.0==-0.0}の結果は&tt(){true}であり&tt(){0.0>-0.0}の結果は&tt(){false}です。しかし他の演算では正のゼロと負のゼロは区別されます。例えば、&tt(){1.0/0.0}の値は正の無限大ですが、&tt(){1.0/-0.0}は負の無限大です。 NaNは&i(){順序付けされない}ので、以下が成り立ちます。: -&link(数値比較演算子<と<=と>と>=){15.20.1. 数値比較演算子<と<=と>と>=}は一方もしくは両方のオペランドがNaNであれば&tt(){false}を返します。 -等価演算子==は一方のオペランドがNaNであれば&tt(){false}を返します。   特に、&tt(){(x<y) == !(x>=y)}は&tt(){x}か&tt(){y}の一方がNaNであれば&tt(){false}です。 -不等価演算子!=は一方のオペランドがNaNであれば&tt(){true}を返します。   特に、&tt(){x!=x}は&tt(){x}がNaNである場合のみ&tt(){true}を返します。 ***[[4.2.4. 浮動小数点演算]] ***[[4.2.5. ブール型とブール値]] **[[4.3. 参照型と値]] **[[4.4. 型変数]] **[[4.5. 引数付き型]] **[[4.6. 型の抹消]] **[[4.7. 具象可能型]] **[[4.8. 未加工型]] **[[4.9. 交差型]] **[[4.10. サブタイプ化]] **[[4.11. 型の使用箇所]] **[[4.12. 変数]]

表示オプション

横に並べて表示:
変化行の前後のみ表示:
目安箱バナー