「.NETのfloat.Epsilon定数は計算機イプシロンではない」の版間の差分
ナビゲーションに移動
検索に移動
imported>Administrator (→解決) |
imported>Administrator (Administrator (トーク) による版 8909 を取り消し) |
||
13行目: | 13行目: | ||
== 解決 == | == 解決 == | ||
<source lang="csharp"> | <source lang="csharp"> | ||
+ | using System; | ||
static double MachineEpsilon() | static double MachineEpsilon() |
2018年2月16日 (金) 01:38時点における版
C#においてfloat型(Single型)の絶対値をfloat.Epsilon定数と比較している箇所の挙動がどうもおかしい。
原因
The value of the F:System.Single.Epsilon property is not equivalent to machine epsilon, which represents the upper bound of the relative error due to rounding in floating-point arithmetic. https://msdn.microsoft.com/ja-jp/library/system.single.epsilon(v=vs.110).aspx
要約すると「浮動小数点演算の丸の相対誤差の上限(丸め誤差発生時にズレるであろう最大値)」であり「計算機イプシロン」ではない。
まじかよ。名前紛らわしすぎだろ。
解決
using System;
static double MachineEpsilon()
{
double eps = 1.0;
do
{
eps /= 2.0;
}
while ((double)(1.0 + eps) != 1.0);
return eps;
}