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

 
Nikolai Semko :


Elbette haklısın. Ama tekrar edeceğim. Görevlerin %99,9'u için, yuvarlama işlevlerini (int) veya (long)'a kesirli tür dönüştürmeyi kullanarak alternatif daha hızlı bir seçenekle değiştirmek kesinlikle yasaldır. Deneyimli bir programcının bu gerçeğin farkında olması ve uygun olduğunda uygulaması yeterlidir.

Vakaların% 99'unda yuvarlama ile hiç uğraşamazsınız. Fiyat karşılaştırmaları için şu saçmalığa sahibim:

 // 0 - first is greater than second
// 1 - equal
// 2 - second is greater than first
uchar compare_prices( double first, double second)
{
   if (first - second >= _Point )
       return 0 ;
   if (second - first >= _Point )
       return 2 ;

   first = round (first/ _Point );
   second = round (second/ _Point );
   
   if (first > second)
       return 0 ;
   if (first < second)
       return 2 ;
   return 1 ;
}

Hızı ölçmemiş olmama rağmen, çoğu durumda () turuna hiç ulaşmayacağını görebilirsiniz.

 
Nikolai Semko :

yukarıya bakın

x = 3 (herhangi bir tamsayı) olduğunda bir karışıklık vardır :))

benim formülümde mi yoksa senin formülünde mi?

Samimi olarak.
 
Andrey Kisselyov :
benim formülümde mi yoksa senin formülünde mi?

Samimi olarak.

eski halimde:

y= ceil (x);  -> y=( int )(x+ 1 );

ve senin içinde:

y= ceil (x);  -> y=( int )(x)+ 1 ;

x=3 için, her iki durumda da yanlış bir 4 değeri olacaktır.

ve seçenek:

y= ceil (x);  -> y=( int )(x+ 0.9999999999999997 );

maksimum yürütme hızını korurken şimdiye kadar en doğru.

 
Nikolai Semko :

eski halimde:

ve senin içinde:

x=3 için, her iki durumda da yanlış bir 4 değeri olacaktır.

ve seçeneği ile:

maksimum yürütme hızını korurken şimdiye kadar en doğru.

ve girdisine bir tamsayı verildiğinde neden bu formüle ihtiyaç duyulur?

Samimi olarak.

PS, iyi bir programcı olmak istiyorsanız , her yerde ve her zaman her türlü hızlandırma işlevini zorlamanız gerekmediğini anlamanız gerekir, bu, çalıştığınız göreve ve algoritmaya bağlıdır.
 
Andrey Kisselyov :

ve girdisine bir tamsayı verildiğinde neden bu formüle ihtiyaç duyulur?

Samimi olarak.


tamam, bütün olup olmadığını bilemeyebilirsin. Çift sayı bir tam sayı olabilir.

 
Andrey Kisselyov :

PS, iyi bir programcı olmak istiyorsanız , her yerde ve her zaman her türlü hızlandırma işlevini zorlamanız gerekmediğini anlamanız gerekir, bu, çalıştığınız göreve ve algoritmaya bağlıdır.

Kesinlikle. Bu yüzden "uygun olduğunda kullan" yazdım.
 
Nikolai Semko :

tamam, bütün olup olmadığını bilemeyebilirsin. Çift sayı bir tam sayı olabilir.

sonra hemen bahçeyi çitle çevirin, girişteki numara seçeneklerinizin altında.
 if (x-( int )(x)> 0 )y=( int )(x)+ 1 ;
else y=x;

Samimi olarak.

PS double tanımı gereği bir tam sayı olamaz, makinenin belleğindeki sayının gösterimi değişmeyecektir.
 
Andrey Kisselyov :
sonra hemen bahçeyi çitle çevirin, girişteki numara seçeneklerinizin altında.

Samimi olarak.


bu yüzden bahçenizi çitle çevirmemek için:

 if (x-( int )(x)> 0 )y=( int )(x)+ 1 ;
else y=x;

yazmak daha kolay:

y=( int )(x+ 0.9999999999999997 );

ya da öylesine

 #define _ceil(x)  ( int )((x)+ 0.9999999999999997 )
...
y=_ceil(x);
 
Nikolai Semko :

bu bahçeyi çitlememek için:

yazmak daha kolay:

de
1- 0.9999999999999998

hiçbir şey almayacaksın.
bu yaklaşımla, her durumda, formülünüzün doğru olmayacağı bir sayı bulabilirsiniz. bahçe çit zorunda kalacak.

Samimi olarak.

 
Andrey Kisselyov :
de

hiçbir şey almayacaksın.
bu yaklaşımla, her durumda, formülünüzün doğru olmayacağı bir sayı bulabilirsiniz. bahçe çit zorunda kalacak.

Samimi olarak.


Bunun hakkında zaten burada yazdım.

Tekrar etmemek için bu konuyu tekrar okumanızı tavsiye ederim.