NormalizeDouble kullanarak MT4'te sayıları yuvarlama - sayfa 17

 
pavlick_ :

Yüzen bir sayının içini tersine çeviren küçük bir öğretici kod yazdım (kendimle uğraşmak eğlenceliydi).

f == 0,5 + 1/(2^24) konumunda egzoz. 1/(2^24) - belirli bir derecede mantisin en az anlamlı basamağı:

Orada tam olarak ne görmek istersiniz? Şamandıraların işaret başına bir biti, üs başına 8 biti vardır, kalan 23'ü mantis, yani. maksimum kesinlik ikili gösterimde 23 ondalık basamak veya ondalık gösterimde 7 ondalık basamaktır. Çift sayıların işaret başına 1 biti, üs başına 11 biti vardır, kalan 52'si mantis, maksimum kesinlik ikili gösterimde 52 ondalık basamak veya 16 ondalık basamaktır. Neden bunun için bir kod var?

 
Sergei Vladimirov :

Orada tam olarak ne görmek istersiniz? Şamandıraların işaret başına bir biti, üs başına 8 biti vardır, kalan 23'ü mantis, yani. maksimum kesinlik ikili gösterimde 23 ondalık basamak veya ondalık gösterimde 7 ondalık basamaktır. Çift sayıların işaret başına 1 biti, üs başına 11 biti vardır, kalan 52'si mantis, maksimum kesinlik ikili gösterimde 52 ondalık basamak veya 16 ondalık basamaktır. Bunun için neden bir kod var?

"Pratiksiz teori ölü ve verimsizdir; teorisiz pratik ise yararsız ve zararlıdır." Ve kayan sayılarla yeterince ilginç şeyler var:
 float a, b, f;
a= 123456789 ;
b= 123456788 ;    
f=a-b;
cout << f;
// cout: 8
 
pavlick_ :
"Pratiksiz teori ölü ve verimsizdir; teorisiz pratik ise yararsız ve zararlıdır." Ve kayan sayılarla yeterince ilginç şeyler var:

Sadece MKL'de benzersiz bir şey beklediğinizi düşündüm.

Ve mantis taşması olan tüm bu numaralar, evet, ilginç. Birinci sınıf için. )

 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 ( "Нифига не равны!" );
}
 
Birinci sınıf için. )
Tabii ki, söyle bana, çoğu programcı soruda yüzüyor, kendimde boşluklar var.
 
pavlick_ :
Tabii ki, söyle bana, çoğu programcı soruda yüzüyor, kendimde boşluklar var.
Şey, bilmiyorum, biz ikili aritmetik konusunda eğitim aldık, böylece ömür boyu kafamızda sıkıştı. ) Başka bir şey de buradaki herkes programcı değil. Genel olarak sorumun bahçenizdeki bir tür taş olduğunu düşünmeyin, sadece programınızın amacının MKL'de standarttan bazı farklılıklar görmek olduğunu düşündüm, o yüzden sordum.
 
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