在MT4中通过NormalizeDouble对数字进行四舍五入 - 页 17

 
pavlick_:

我写了一点训练代码(我自己也有兴趣去探究),它把浮动数的内幕翻了出来。

f处的输出==0.5+1/(2^24)。1/(2^24)是给定度数的尾数中最年轻的数字。

你到底想在那里看到什么?浮点数每个符号有1位,每个指数有8位,剩下的23位是尾数,也就是说,最大精度是二进制表示的23位小数,或者7位小数。对于双数,每个符号有1位,每个指数有11位,剩下的52位是尾数,最大精度是二进制表示的52位小数或16位小数。为什么会有这样的代码?

 
Sergei Vladimirov:

你到底想在那里看到什么?浮点数每个符号有1位,每个指数有8位,剩下的23位是尾数,即二进制表示法中小数点后23位的最大精度,即小数点后7位。对于双数,每个符号有1位,每个指数有11位,剩下的52位是尾数,最大精度是二进制表示的52位小数或16位小数。为什么会有这样的代码?

"没有实践的理论是死的,没有结果的,没有理论的实践是无用的,有害的。"而各种有趣的浮动数字的东西比比皆是。
float a, b, f;
a=123456789;
b=123456788;    
f=a-b;
cout << f;
// cout: 8
 
pavlick_:
"没有实践的理论是死的,没有结果的,没有理论的实践是无用的,有害的。"还有各种有趣的浮动数字的东西。

我只是想,也许你在期待着MKL的独特之处。

而整个尾数溢出的事情也很有趣。适用于一年级。)

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("Нифига не равны!");
}
 
对于一年级。)
当然,告诉我们吧,大多数程序员对这个问题都不了解,我自己也有一些差距。
 
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