■89987 / inTopicNo.5) |
Re[4]: クラス内にFunctionを作る方法 |
□投稿者/ 魔界の仮面弁士 (2022回)-(2019/01/28(Mon) 16:27:21)
|
■No89979 (かめかめ さん) に返信
>> Return {L, R, T, B}.All(Function(value) Math.Abs(value - 0F) < Single.Epsilon)
> Return {L, R, T, B}.All(Function(value) value = 0F)
> というようにしないのはなぜなのですか?
既にキングダム さん本人から訂正が入っているので蛇足ではありますが、
No89978 の判定式のまま処理してしまうと、結果的には
上記 No89979 の判定式と同じ意味になってしまいます。
(許容値は Single.Epsilon より大きな値でないといけません)
ちなみに、「メモリ上完全にゼロな Single 値」であることを保証したい場合には、
『.All(Function(value) value = 0F)』ではなく、
『.SelectMany(AddressOf BitConverter.GetBytes).All(Function(b) b = 0)』などとします。
※Single 値が「0.0F」ではなく「-0.0F」だった場合に、異なる結果となります。
■No89982 (キングダム さん) に返信
> 有効な最小値にはマシンイプシロンがよく使われるので
> Math.Abs(value - 0F) < Single.Epsilon
ちなみに ARM プロセッサの場合は、Single.Epsilon が 0.0 と等しくなってしまうそうな…。
https://docs.microsoft.com/en-us/dotnet/api/system.single.epsilon
> 単精度浮動小数点数のマシンイプシロンは2^-23なので
> Math.Abs(value - 0F) < 0.0000001192093F
上記の右辺で使われている値は、「2 ^ -23 よりも大きな最小の Single 値」に相当する
0.0000001192093037616359652020037174224853515625 な値ですね。有効桁数の問題から
0.0000001192093F というリテラル表記になりますけど。
(Single 値の有効桁数は 10進数換算で 7.2247 桁分しかないため)
一方、「(1より大きい最小値)から 1 を引いた値」である「2 ^ -23」自体の値は、
上記の右辺よりも「2 ^ -46」だけ少ない値となります。
具体的には「0.00000011920928955078125」≒「0.00000011920929F」です。
|
|