Category:LSL Float/ja
LSL ポータル | 関数 | イベント | 型 | 演算子 | 定数 | 実行制御 | スクリプトライブラリ | カテゴリ別スクリプトライブラリ | チュートリアル |
浮動小数点数データ型はIEEE-754形式の32ビット(単精度)の数値です。 小数点付きの数値を使いたいときはfloatを使用します。
表現できる範囲は1.175494351E-38 〜 3.402823466E+38です。
2.6E-5のような科学的表記で表現することができます。
関数が引数としてfloatを要求しているときに、数値が整数(例えば5)ならば、float(例えば5.0)として生成されるように.0を付加します。
二つの定数を除算するなら、float型として定義をしないと結果が丸められるでしょう。いっそのこと、電卓であらかじめ計算しておくと、サーバーの数サイクルを節約します。
例
float min = 1.175494351E-38;
float max = 3.402823466E+38;
float sci = 2.6E-5;
float sci_a = 2.6E+3;
float sci_b = 2.6E3;
float sci_c = 26000.E-1;
float f = 2600; //floatへの暗黙の型変換
float E = 85.34859;
float Infintity = (float)"inf"; //-- LSOで評価されるなら、算術エラーを起こし、おそらく使えないでしょう。下の"警告"を見てください。
float NotANumber = (float)"nan"; //-- LSOで評価されるなら、算術エラーを起こし、おそらく使えないでしょう。下の"警告"を見てください。
便利なスニペット
制限なしで、任意のfloatが有効かどうかを得たいなら、以下の関数は理想的です。
integer isValidFloat(string s) { return (string)((float)s) != (string)((float)("-" + llStringTrim(s, STRING_TRIM_HEAD))); }
ただし、以下の方法はより効率的ですが、注意事項があります。これらが問題ではない場合、特にMonoの場合にはお勧めのオプションです。
integer isValidFloat(string s) { return (float)(s + "1") != 0.0; }
次のものはより効率的ですが、有名な注意点があります。これらが問題でない場合、特にMonoにおいて、お勧めの選択肢です。 <lsl>integer isValidFloat(string s) { return (float)(s + "1") != 0.0; }</source> 警告:
- LSO-LSLの科学的表記では、指数部を38より大きくできません(算術エラーを投げます)。Monoは
infinity
をサポートしており、影響を受けません。 - MonoとLSO-LSLの両方において、小数点以下第9位以降を含む文字列を扱っているとき、おかしな結果を見かけるかもしれません。LSLでのstringへのキャストでは小数点以下6桁まで丸められ、人間の手による入力はあまり正確でなくなり、そして、通常、あまりに小さい値はそんなに役に立たないということを思い出してください。
- "nan"、"inf"とそれらの負の値は、stringからキャストできる、特別なテキスト値です(どんな先頭の空白や末尾の文字でも)。変数がLSOで評価されるとき、それらの値は算術エラーを引き起こすでしょう。stringからfloatへのキャストによってユーザーデータを調べるなら、以下のコード(vStrDtaはあなたの変数名に置き換えてください)とSVC-6847を見てください。
(float)llList2String( llParseStringKeepNulls( llToLower( llStringTrim( vStrDta, STRING_TRIM ) ), ["inf", "nan"], [] ), 0 )
以下のスニペットでは、浮動小数点文字列において有効でない最初の文字で検証が停止します。一方、以下のコードは速度とメモリの使用量を犠牲にして、文字列全体が浮動小数点数を表しており(それ以外のものではないことを)厳格に検証します。
// Validate a string containing a float value
// Does not handle scientific notation, or hex floats (!!)
// After all, this is designed for 95% of likely human entered data
integer ValidateSimpleFloat(string sin)
{
sin = llToLower(sin);
// Avoid run time fail (for lslEditor at least) if string looks remotely like scientific notation
if (llSubStringIndex(sin, "e") != -1) return FALSE;
list temp = llParseStringKeepNulls(sin, ["."], [] );
string subs = llList2String(temp, 0);
if ( (string) ( (integer) subs) != subs) return FALSE;
if ( (temp != []) > 2) return FALSE;
if ( (temp != [])== 2)
{
subs = llList2String(temp, 1); // extract the decimal part
// must have no sign after DP, so handle first decimal discretely
string first = llGetSubString(subs, 0, 0);
if ( (string) ( (integer) first) != first) return FALSE;
if ( (string) ( (integer) subs) != subs) return FALSE;
}
return TRUE;
}
Float-to-String
浮動小数点数を文字列に変換する方法はいくつかあります。その1つは、それを文字列に型変換する方法です(string)(1.0))。しかし、これには丸めが発生し、小数点以下が6桁に制限されるという欠点があります。より多くのオプションを提供するためにいくつかの関数が作成されています。これらは、損失のない(lossless)と損失のある(lossy)の2つのカテゴリに分けることができます。
Name | inf/nan | Rounding | Truncation | Notes |
---|---|---|---|---|
Typecast | Yes | Yes | No | (string)float_value Mono only gives 6 digits of precision. |
Format Decimal | No | Yes | No | |
Float2String | No | Yes | Yes |
Name | Speed | Reversible | inf/nan support | PI | Notes |
---|---|---|---|---|---|
Float2Hex | Fast | (float)
|
No | 0x6487ED5p-25 | 出力が16進数の科学的表記法であるため、実際には人間には読み取りにくいです。 |
Float2Sci | Slow | (float)
|
No | 3.1415925 | 結果を損失なく保ちつつ、人間に読み取りやすくする場合に便利ですが、速度を犠牲にする必要があります。 |
FUIS | Fastest | SIUF | No | "QEkP2g" | 全く人間には読み取りづらく、常に6文字を使用することが保証されています。 |
- Infinity is only accessible in Mono.
関連項目
用語
- LSL Examples: Format Decimal
Pages in category "LSL Float/ja"
The following 6 pages are in this category, out of 6 total.