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

 
pavlick_ :

Neden uzun atmıyorsun? Taşabilir olsa da, bir int'yi taşmak çok daha kolaydır.


Tabii ki, gerekirse uzun da yapabilirsiniz.

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

x=3;

y=3; y=4;

 
Nikolai Semko :

Tabii ki, gerekirse uzun da yapabilirsiniz.

Yani yolun reklamını yaparsanız, aptalca kopyalanacaktır. Genel olarak, herhangi bir kontrol olmadan bu şekilde yayın yapamazsınız, bu UB:

Gerçek kayan türün sonlu bir değeri _Bool dışında bir tamsayı türüne dönüştürüldüğünde, kesirli kısım atılır (yani değer sıfıra doğru kesilir). İntegral parçanın değeri tamsayı türüyle temsil edilemiyorsa, davranış tanımsızdır.
Belki depozito birleşir veya belki başka bir şey yapar))
 
pavlick_ :

Yani yolun reklamını yaparsanız, aptalca kopyalanacaktır. Genel olarak, herhangi bir kontrol olmadan bu şekilde yayın yapamazsınız, bu UB:

Belki depozito birleşir veya belki başka bir şey yapar))

Ben hiçbir şeyin reklamını yapmıyorum. bir fikir paylaşıyorum. Bu forum ve tartışmalar bunun için var.

 
Dmitry Fedoseev :

x=3;

y=3; y=4;


kesinlikle! spsb. Tavanla neler yapılabileceğini düşünmem gerekiyor.

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

Dmitry Fedoseev :

x=3;

y=3; y=4;

bir seçenek olarak, çok güzel olmasa da, hız aynı:

y= ceil (x);  -> y=( int )(x+ 0.999999999999999 );
 #define _ceil(x)  ( int )((x)+ 0.999999999999999 )

double x= 3 ;
int y=_ceil(x);
 
 
Nikolai Semko :

bir seçenek olarak, çok güzel olmasa da, hız aynı:

O zaman muhtemelen daha iyi olurdu: x + 1 - DBL_MIN . Ya x + 1 - DBL_EPSILON. Test etmedim , deneyin.

Peki ya negatif sayılar? Sonuçta, tavan ve zemin için farklı olmalı

 
Alexey Navoykov :

O zaman muhtemelen daha iyi olurdu: x + 1 - DBL_MIN . Ya x + 1 - DBL_EPSILON. Test etmedim , deneyin.

Peki ya negatif sayılar? Sonuçta, tavan ve zemin için farklı olmalı

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.

Evet, haklısın - negatif sayılar için farklı bir algoritma olmalı. Teşekkür ederim! İlk mesaja ekleyeceğim.

Kimin umurunda - sorunun negatif sayılarla nasıl çözüleceğini düşünebilir. Şahsen ilgilenmiyorum, tk. tüm görevlerim pozitif sayılar içeriyor.

 
Nikolai Semko :

Muhtemelen 0.9999999999999999 (16 dokuz, çift olarak maksimum ondalık basamak sayısıdır) bırakmak mantıklıdır.

 void OnStart ()
{
         Print (( int )( 3.0 + 0.9999999999999999 ));
}
sonucu kontrol ettin mi?
 

A100 :

 void OnStart ()
{
         Print ( ( int )( 3 + 0.9999999999999999 ));
}


evet, ama eğer:

x= 3 ;
int Y=( int ) ceil (x);
Print (Y);
Y=( int )(x+ 0.999999999999999 );
Print (Y);

sonra her şey yolunda. Derleyici harikalar yaratıyor. :))