NormalizeDoubleによるMT4での数値の丸め方 - ページ 17

 
pavlick_:

浮動小数点数の内部をひっくり返す、ちょっとしたトレーニングコードを書きました(自分でつっこんでみたくなった)。

fでの出力 == 0.5 + 1/(2^24)。1/(2^24)は、ある度数での仮数の最下位桁 です。

そこで具体的に何を見たかったのでしょうか?浮動小数点数は符号に1ビット、指数に8ビット、残りの23ビットが仮数であり、すなわち最大精度は2進数表現で小数点以下23桁、すなわち10進数7桁である。倍数の場合、符号に1ビット、指数に11ビット、残りの52ビットが仮数となり、最大精度は2進数表現で小数点以下52桁、小数点以下16桁となります。なぜコードがあるのですか?

 
Sergei Vladimirov:

そこで具体的に何を見たかったのでしょうか?浮動小数点数は符号に1ビット、指数に8ビット、残りの23ビットが仮数、すなわち2進数表現で小数点以下23桁、つまり小数点以下7桁の最大精度を持っています。倍数の場合、符号に1ビット、指数に11ビット、残り52ビットが仮数となり、最大精度は2進数表現で小数点以下52桁、小数点以下16桁となります。なぜコードがあるのですか?

"実践なき理論は死んで実を結ばず、理論なき実践は無用で悪質である"そして、浮動小数点数を使った面白いものがいろいろとあふれています。
float a, b, f;
a=123456789;
b=123456788;    
f=a-b;
cout << f;
// cout: 8
 
pavlick_:
"実践なき理論は死んで実を結ばず、理論なき実践は役に立たず有害である"それに、浮動小数点数にはいろいろと面白いことがあるんですよ。

もしかしたら、MKLならではのものを期待されているのかなと思いまして。

そして、仮数オーバーフローというのは面白いですね。小学1年生向け。)

void OnStart()
{
        float f1 = (float)1.1;
        float f2 = (float)2.2;
        float f3 = (float)3.3;
        
        if((f1 * f2) * f3 == f1 * (f2 * f3))
                Print("Выражения равны.");
        else
                Print("Нифига не равны!");
}
 
小学1年生向け。)
もちろん、教えてください。ほとんどのプログラマーはこのテーマについて理解が浅く、私自身も多少のギャップがあります。
 
pavlick_:
もちろん、教えてください。ほとんどのプログラマーはこのテーマに対応していませんし、私自身も多少のギャップはあります。
まあ、私たちは二進法の訓練を受けたので、それが一生頭に残るんでしょうかね。) もうひとつは、全員がプログラマーではないことです。一般的に、私の質問があなたの庭の石ころのようなものだとは思っていないでしょう。私はただ、あなたのプログラムの目的 - 基準とMCLのいくつかの違いを見るために、と思ったので、質問したのです。
 
int main(){
  // МКЛ аналог numeric_limits<float>::epsilon() - FLT_EPSILON
  float a = (float)10 + numeric_limits<float>::epsilon();
  float b = (float)1 + numeric_limits<float>::epsilon();
  float c = (float)0.5 + numeric_limits<float>::epsilon();
  print_float(a);
  print_float(b);
  print_float(c);
}

----a--------------
value = 10
mantissa 24:
1,01000000000000000000000
exponenta - 127 = 3

мантиса без прибавки эпсилон:
1,01000000000000000000000
----b--------------
value = 1.0000001192092896
mantissa 24:
1,00000000000000000000001
exponenta - 127 = 0

мантиса без прибавки эпсилон:
1,00000000000000000000000
----c--------------
 value = 0.50000011920928955
mantissa 24:
1,00000000000000000000010
exponenta - 127 = -1

мантиса без прибавки эпсилон:
1,00000000000000000000000
理由: