Palm Programmer's Laboratory
Palm OS Programmer's API Reference/36
この章の索引
36 浮動小数点数マネージャ
この章では、以下に示す浮動小数点数マネージャのための参照資源を提供します。
浮動小数点数マネージャ API はヘッダ ファイル FloatMgr.h で定義されています。浮動小数点数マネージャについての追加情報は、Palm OS Programmer's Companion, vol. I の「浮動小数点数」を参照してください。
浮動小数点数マネージャ データ構造体 ^TOP^
FlpCompDouble 構造体 ^TOP^
目的
不動小数点数マネージャ関数は、FlpDouble 型の値を受け入れ、要求します。FlpCompDouble 共用体は、倍精度数としても、FlpDouble としても解釈できる値を定義することを可能にします。さらに、この共用体は、倍精度浮動小数点数の構成するパーツへの容易なアクセスを提供するフィールドを保持します。
Prototype
typedef union { double d; FlpDouble fd; UInt32 ul[2]; FlpDoubleBits fdb; } FlpCompDouble
フィールド
- d
- double としての値へのアクセスを提供します。
- fd
- FlpDouble としての値へのアクセスを提供します。FlpDouble は多くの浮動小数点マネージャ関数とやり取りできるデータです。
- ul
- 倍精度整数としての値へのアクセスを提供します。
- fdb
- ある特定のフィールドへのアクセスを提供します。
FlpDoubleBits 構造体 ^TOP^
この構造体は IEEE-754 倍精度浮動小数点数の構成パーツへの直接のアクセスを提供します。FlpDoubleBits から double 型に変換するには FlpCompDouble 共用体を使用してください。
Prototype
typedef struct { UInt32 sign : 1; Int32 exp : 11; UInt32 manH : 20; UInt32 manL; } FlpDoubleBits
フィールド
- sign
- 符号ビット。FlpGetSign() マクロを使用して符号ビットを取得し、FlpNegate(), FlpSetNegative(), FlpSetPositive() マクロを使って符号ビットをセットすることができます。
- exp
- 指数を表すビット(列)。FlpGetExponent() マクロを使って指数値を取得することができます。
- manH
- 仮数部の上位 20 ビット。
- manL
- 仮数部の下位 32 ビット。
不動小数点数マネージャ関数 ^TOP^
FlpAToF 関数 ^TOP^
目的
null で終了する ASCII 文字列を 64 ビット浮動小数点数に変換します。文字列は以下のフォーマットでなければなりません。
[+|-][digits][.][digits][e|E[+|-][digits]]
宣言されている場所
FloatMgr.h
Prototype
FlpDouble FlpAToF ( const Char *s )
パラメータ
- → s
返り値
文字列の不動小数点数としての値を返します。
コメント
数の仮数部は 32 ビットまでに制限されています。
この関数は ISO C ライブラリ関数の atof と互換性を持つくらいに近いものです。atof は以下のフォームを要求します。
[+|-]digits[.][digits][(e|E)[+|-]digits]
Palm OS 1.0 の浮動小数点数マネージャ(これは Palm OS 4.0 まで使うことができました。しかし含まれてはいませんでした)への下位互換を維持するために、この関数はすべての「digits」セクションをオプションと見なします。以下の表でいくつかのサンプル文字列に対する ISO と Palm OS の振る舞いを示します。
文字列 | ISO | >= Palm OS 4.0 | < Palm OS 4.0 補足1 | NOTES |
---|---|---|---|---|
+ | +0 | +0 | +0 | |
"0.3" | 0.3 | 0.3 | 0.3 | |
"0.3e123" | 0.3e123 | 0.3e123 | 0.3e12 | 古い浮動小数点数マネージャは 1 または 2 桁の指数を受け付けます。 |
"+1" | 1 | 1 | +0 | 古い浮動小数点数マネージャは '+' 符号で始まることを認めません。 |
"1e+2" | 1e2 | 1e2 | 1 | 古い浮動小数点数マネージャは指数の中に '+' 符合があることを認めません。 |
"0.3E3" | 0.3e3 | 0.3e3 | 0.3 | 古い浮動小数点数マネージャは大文字 'E' の指数マークを認めません。 |
"4294967297" | 4294967297 | 4294967297 | 1 | 古い浮動小数点数マネージャは長整数を使用し、丸めを行います。 |
古い浮動小数点数マネージャの使用については 付録 C 「1.0 浮動小数点数マネージャ」 で説明されています。
atof とは異なり、FlpAToF はスペース文字で始まることを認めません。また、'.' 以外の小数点文字も認めません。
互換性
2.0 New Feature Set が満たされる場合にのみ、実装されます。GCC ユーザはこの関数の代わりに FlpBufferAToF() を使わなくてはなりません。
参照
FlpBase10Info 関数 ^TOP^
目的
浮動小数点数の基数 10 フォームの詳細情報: 基数 10 の仮数、指数、符号を抽出します。
宣言されている場所
FloatMgr.h
Prototype
Err FlpBase10Info ( FlpDouble a, UInt32 *mantissaP, Int16 *exponentP, Int16 *signP )
パラメータ
- → a
- 浮動小数点数
- ← mantissaP
- 基数 10 の仮数
- ← exponentP
- 基数 10 の指数
- ← signP
- 符号: 数が負の場合は 1、そうでない場合は 0
返り値
エラーが無い場合は 0 を返します。与えられた浮動小数点数が数でない(NaN)または無限数の場合は flpErrOutOfRange を返します。
コメント
仮数は、整数として表示されるとき少なくとも 8 桁になるように、正規化されます。
互換性
2.0 New Feature Set が満たされる場合にのみ、実装されます。
参照
FlpGetExponent(), FlpGetSign()
FlpBufferAToF 関数 ^TOP^
目的
null で終了する ASCII 文字列を浮動小数点数に変換します。文字列のフォーマットは [-]x[.]yyyyyyyy[e[-]zz] でなければなりません。
宣言されている場所
FloatMgr.h
Prototype
void FlpBufferAToF ( FlpDouble *result, const Char *s )
パラメータ
- ← result
- 返り値が収められている構造体へのポインタ
- → s
- 変換される ASCII 文字列へのポインタ
返り値
浮動小数点数としての文字列の値を返します。
コメント
この関数についての完全な説明は FlpAToF() を参照してください。
互換性
2.0 New Feature Set が満たされる場合にのみ、実装されます。GCC が返すデフォルトで実装されている構造体は、ROM をビルドするのに使用されるコンパイラの構造体とは異なります。結果として、GCC ユーザは FlpAToF() の代わりにこの関数を使わなくてはなりません。CodeWarrior ユーザはどちらの関数でも使用することができます; それらはバイナリで互換性があります。
FlpBufferCorrectedAdd 関数 ^TOP^
目的
2 つの浮動小数点数の加算を行い、結果が 0 になるべきだが 0 に近い値になるときに最下位ビット エラーの訂正を行います。
宣言されている場所
FloatMgr.h
Prototype
void FlpBufferCorrectedAdd ( FlpDouble *result, FlpDouble firstOperand, FlpDouble secondOperand, Int16 howAccurate )
パラメータ
- ← result
- 返り値が収められている構造体へのポインタ
- → firstOperand
- 加算される 2 つの数の最初の数
- → secondOperand
- 加算される 2 つの数の 2 番目の数
- → howAccurate
- 結果を強制的に 0 にしない指数の最小差。2 つのオペランドの小さいほうの指数と計算結果との指数の差がこの値を超える場合、この関数によって返される値は強制的に 0 になります。デフォルト レベルの精度にする場合は、このパラメータに 0 の値を与えます。(この場合、48 の howAccurate 値にした場合と等価です。)
返り値
計算結果を返します。
コメント
この関数の完全な説明は FlpCorrectedAdd() を参照してください。
互換性
2.0 New Feature Set が満たされる場合にのみ、実装されます。GCC が返すデフォルトで実装されている構造体は、ROM をビルドするのに使用されるコンパイラの構造体とは異なります。結果として、GCC ユーザは FlpAToF() の代わりにこの関数を使わなくてはなりません。CodeWarrior ユーザはどちらの関数でも使用することができます; それらはバイナリで互換性があります。
FlpBufferCorrectedSub 関数 ^TOP^
目的
2 つの浮動小数点数の減算を行い、結果が 0 になるべきだが 0 に近い値になるときに最下位ビット エラーの訂正を行います。
宣言されている場所
FloatMgr.h
Prototype
void FlpBufferCorrectedSub ( FlpDouble *result, FlpDouble firstOperand, FlpDouble secondOperand, Int16 howAccurate )
パラメータ
- ← result
- 返り値が収められている構造体へのポインタ
- → firstOperand
- secondOperand が引かれる値
- → secondOperand
- firstOperand から引く値
- → howAccurate
- 結果を強制的に 0 にしない指数の最小差。2 つのオペランドの小さいほうの指数と計算結果の指数との差がこの値を超える場合、この関数によって返される値は強制的に 0 になります。デフォルト レベルの精度にする場合は、このパラメータに 0 の値を与えます。(この場合、48 の howAccurate 値にした場合と等価です。)
返り値
計算結果を返します。
コメント
この関数の完全な説明は FlpCorrectedSub() を参照してください。
互換性
2.0 New Feature Set が満たされる場合にのみ、実装されます。GCC が返すデフォルトで実装されている構造体は、ROM をビルドするのに使用されるコンパイラの構造体とは異なります。結果として、GCC ユーザは FlpAToF() の代わりにこの関数を使わなくてはなりません。CodeWarrior ユーザはどちらの関数でも使用することができます; それらはバイナリで互換性があります。
FlpCorrectedAdd 関数 ^TOP^
目的
2 つの浮動小数点数の加算を行い、結果が 0 になるべきだが 0 に近い値になるときに最下位ビット エラーの訂正を行います。
宣言されている場所
FloatMgr.h
Prototype
FlpDouble FlpCorrectedAdd ( FlpDouble firstOperand, FlpDouble secondOperand, Int16 howAccurate )
パラメータ
- → firstOperand
- 加算される 2 つの数の最初の数
- → secondOperand
- 加算される 2 つの数の 2 番目の数
- → howAccurate
- 結果を強制的に 0 にしない指数の最小差。2 つのオペランドの小さいほうの指数と計算結果の指数との差がこの値を超える場合、FlpCorrectedAdd によって返される値は強制的に 0 になります。デフォルト レベルの精度にする場合は、このパラメータに 0 の値を与えます。(この場合、48 の howAccurate 値にした場合と等価です。)
返り値
計算結果を返します。
コメント
大きな数と小さな数の加算または減算の結果は、大きなほうの数と絶対値が近いものになります。絶対値が似通った 2 つの数の加算または減算の結果は、符号にもよりますが、非常に小さな指数を持つことになります(つまり、絶対値が大きい負の指数)。計算結果の指数とオペランドの指数の差が、仮数で表現することができる有効ビットの数に近い場合、計算結果を事実上 0 と見なせます。
仮数の下位ビットの精度を維持することが役立つかもしれないケースが存在します。たとえば、99999999 + 0.00000001 - 99999999 です。しかしながら、小数点以下の部分が正確に 2 の(負の)べき乗でない限り、ほんの数ビットしかない使用可能な値が小数点以下の値を適切に表すのに十分かどうかは疑わしいです。この例では、99999999 を表すのに 26 ビット必要(訳者注: 27 ビットではないか?)で、残りの .00000001 を表すのに 26 ビット必要(訳者注: 27 ビットではないか?)です; これが減算後の不正確さを保証します。
0.1 のような 10 の分数をバイナリで表す困難さに起因する問題もあります。約 3 回の加算また減算後に、仮数の最下位ビットにエラーが現れ始めます。その後に仮数の上位ビットによって表される値が減算によって引かれてしまった場合 -- 計算結果は 0 になるべきなのですが -- 最下位ビット エラーが正規化され、事実上の計算結果になります。
この問題は、加算と減算による問題であるにすぎません。
互換性
2.0 New Feature Set が満たされる場合にのみ、実装されます。GCC ユーザはこの関数の代わりに FlpBufferCorrectedAdd() を使用しなくてはなりません。
参照
FlpCorrectedSub 関数 ^TOP^
目的
2 つの浮動小数点数の減算を行い、結果が 0 になるべきだが 0 に近い値になるときに最下位ビット エラーの訂正を行います。
宣言されている場所
FloatMgr.h
Prototype
FlpDouble FlpCorrectedSub ( FlpDouble firstOperand, FlpDouble secondOperand, Int16 howAccurate )
パラメータ
- → firstOperand
- secondOperand が引かれる値
- → secondOperand
- firstOperand から引く値
- → howAccurate
- 結果を強制的に 0 にしない指数の最小差。2 つのオペランドの小さいほうの指数と計算結果の指数との差がこの値を超える場合、FlpCorrectedSub によって返される値は強制的に 0 になります。デフォルト レベルの精度にする場合は、このパラメータに 0 の値を与えます。(この場合、48 の howAccurate 値にした場合と等価です。)
返り値
計算結果を返します。
コメント
この関数の完全な説明は FlpCorrectedAdd() を参照してください。
互換性
2.0 New Feature Set が満たされる場合にのみ、実装されます。GCC ユーザはこの関数の代わりに FlpBufferCorrectedSub() を使用しなくてはなりません。
FlpFToA 関数 ^TOP^
目的
浮動小数点数を null で終了する ASCII 文字列へ変換します。文字列は指数形式: [-]x.yyyyyyye[-]zz になります。
宣言されている場所
FloatMgr.h
Prototype
Err FlpFToA ( FlpDouble a, Char *s )
パラメータ
- → a
- 浮動小数点数
- ← s
- ASCII 文字列を保持するバッファへのポインタ
返り値
エラーが無い場合、0 を返します。与えられた値が数でないまたは無限数である場合、flpErrOutOfRange を返し、バッファは状況に応じて "INF", "-INF", "NaN" にセットされます。
コメント
与えられた浮動小数点数が 0 である場合、返される文字列は指数形式ではなく、単に "0" です。
互換性
2.0 New Feature Set が満たされる場合にのみ、実装されます。
参照
FlpGetExponent マクロ ^TOP^
目的
64 ビット浮動小数点数値の指数を返します。返される値はバイアスが適用されるため、-1023 から +1024 の範囲になります。
宣言されている場所
FloatMgr.h
Prototype
#define FlpGetExponent ( x )
パラメータ
- → x
- 指数が抽出される値
返り値
指定された値の指数を保持する UInt32 を返します。
互換性
2.0 New Feature Set が満たされる場合にのみ、実装されます。
参照
FlpGetSign マクロ ^TOP^
目的
64 ビット浮動小数点数値の符号を返します。
宣言されている場所
FloatMgr.h
Prototype
#define FlpGetSign ( x )
パラメータ
- → x
- 符号ビットが抽出される値
返り値
指定された値が負の場合、0 ではない UInt32 を返します。正の場合、0 の UInt32 を返します。
互換性
2.0 New Feature Set が満たされる場合にのみ、実装されます。
参照
FlpBase10Info(), FlpGetExponent(), FlpNegate(), FlpSetNegative(), FlpSetPositive()
FlpIsZero マクロ ^TOP^
目的
指定された 64 ビット浮動小数点数値が 0 かどうかを返します。
宣言されている場所
FloatMgr.h
Prototype
#define FlpIsZero ( x )
パラメータ
- → x
- 符号ビットが求められている値
返り値
指定された値が 0 の場合、0 ではない UInt32 を返します。指定された値が 0 以外の値である場合、0 の UInt32 を返します。
互換性
2.0 New Feature Set が満たされる場合にのみ、実装されます。
FlpNegate マクロ ^TOP^
目的
64 ビット浮動小数点数の符号ビットを変更します。
宣言されている場所
FloatMgr.h
Prototype
#define FlpNegate ( x )
パラメータ
- → x
- 符号ビットが変更される値
返り値
x で指定された値の符号を反転させた 64 ビット浮動小数点数を返します。
互換性
2.0 New Feature Set が満たされる場合にのみ、実装されます。
参照
FlpGetSign(), FlpSetNegative(), FlpSetPositive()
FlpSetNegative マクロ ^TOP^
目的
64 ビット浮動小数点数が負であることを保証します。
宣言されている場所
FloatMgr.h
Prototype
#define FlpSetNegative ( x )
パラメータ
- → x
- 強制的に負にさせられる値
返り値
与えられた 64 ビット浮動小数点数値が負である場合、値は変更されずに返されます。与えられた値が正である場合、その値を負にしたものが返されます。
互換性
2.0 New Feature Set が満たされる場合にのみ、実装されます。
参照
FlpGetSign(), FlpNegate(), FlpSetPositive()
FlpSetPositive マクロ ^TOP^
目的
64 ビット浮動小数点数が正であることを保証します。
宣言されている場所
FloatMgr.h
Prototype
#define FlpSetPositive ( x )
パラメータ
- → x
- 強制的に正にさせられる値
返り値
与えられた 64 ビット浮動小数点数値が正である場合、値は変更されずに返されます。与えられた値が負である場合、その値の絶対値が返されます。
互換性
2.0 New Feature Set が満たされる場合にのみ、実装されます。
参照
FlpGetSign(), FlpNegate(), FlpSetNegative()
FlpVersion 関数 ^TOP^
目的
浮動小数点数マネージャのバージョン番号を返します。
宣言されている場所
FloatMgr.h
Prototype
UInt32 FlpVersion ( void )
パラメータ
ありません。
返り値
浮動小数点数マネージャのバージョン番号を返します。現在のバージョンは、FloatMgr.h で定義されている定数 flpVersion です。
互換性
2.0 New Feature Set が満たされる場合にのみ、実装されます。