ceil(), round(), floor() fonksiyonlarının yürütme hızı - sayfa 3

 
Nikolai Semko :

evet, ama eğer:

sonra her şey yolunda.

Herhangi bir x sayısı için her şeyin iyi olacağından emin olmak için kalır.
 

A100 :

 void OnStart ()
{
         Print ( ( int )( 3.0001 + 0.999999999999999 )); //все равно 4
         Print ( floor ( 3.00001 ));                     //3
}




anlamadı. Jamb nedir?

 
A100 :
Herhangi bir x sayısı için her şeyin iyi olacağından emin olmak için kalır.

Tabii ki olmayacak...

Sonuçta, bu olursa:

 double x= 3 ;
x=x+ 0.1 ;
x=x+ 0.1 ;
x=x+ 0.1 ;
x=x+ 0.1 ;
if (x!= 3.4 ) Print ( "oppps..." ); // oppps...

o zaman, sorular benim için değil, bu fikir için değil.

 
Nikolai Semko :
Jamb nedir?
 void OnStart ()
{
         double d =   16 + 0.999999999999999 ;
         Print ( ( int )(d + 0.999999999999999 )); //18
         Print ( ( int ) ceil ( d ));               //17
}
 
A100 :

önceki mesajıma bakın

 
Nikolai Semko :
o zaman, sorular benim için değil, bu fikir için değil.
zemin(), ceil(), round() bunun için var - böylece soru yok
 

Yukarıda listelenen tüm bu kusurların, pozitif sayıların yuvarlanmasını hızlandırmak için bu çözümün pratik kullanımının kapsamı dışında olduğunu düşünüyorum, çünkü çok az kişinin 16 karakter düzeyinde doğruluğa ihtiyacı vardır. Ve bu pervazlar, derleyicinin kendisinin yirminci karakterlerinin seviyelerindeki çeşitli taşma türlerinden kaynaklanır.

 
A100 :
zemin(), ceil(), round() bunun için var - böylece soru yok

Bunları kullanmanızı yasaklamıyorum. Sağlık üzerinde kullanın. Onları kendim kullanacağım. Ama hızın önemli olduğu bir algoritma oluşturursam, bu yöntemin tüm nüanslarını dikkate alarak bu yuvarlama seçeneğini kullanacağım. Diğer programcıların da böyle bir alternatifin varlığından haberdar olmalarının faydalı olacağını düşünüyorum. Bu yuvarlama yönteminin nüanslarını bilmek için tam da ihtiyaç duyulan şey tartışmadır. Bunun için herkese çok teşekkürler. Yanlış mıyım?

 
Nikolai Semko :

DBL_MIN ve DBL_EPSILON çalışmıyor - çok küçük. Muhtemelen 0.9999999999999999 (16 dokuz, çift olarak maksimum ondalık basamak sayısıdır) bırakmak mantıklıdır.

Yani DBL_EPSILON 16 ondalık basamaktır: 2.2204460492503131e-016

Ve senin durumunda, aslında bir olduğu ortaya çıkıyor, çünkü. fark sadece 1e-16, yani epsilon'dan 2 kat daha az.

 
Alexey Navoykov :

Yani DBL_EPSILON 16 ondalık basamaktır: 2.2204460492503131e-016

Ve senin durumunda, aslında bir olduğu ortaya çıkıyor, çünkü. fark sadece 1e-16, yani epsilon'dan 2 kat daha az.


Evet, anlıyorum ama işe yaramıyor. 16 dokuzla çalışmadığı ortaya çıktı (garip, daha önce çalışıyor gibiydi). Sadece 15 dokuz ile çalışır.

 double x= 3 ;
int Y=( int ) ceil (x);
Print (Y);                         // 3
Y=( int )(x+ 0.999999999999999 ); 
Print (Y);                         // 3  (15 9-ток)
Y=( int )(x+ 0.9999999999999999 );
Print (Y);                         // 4  (16 9-ток)
Y=( int )(x+ 1 - DBL_EPSILON );
Print (Y);                         // 4