ceil(),round(),floor()関数の実行速度 - ページ 2

 
pavlick_:

なぜロングにキャストしないのか?オーバーフローさせることもできますが、Intをオーバーフローさせる方がはるかに簡単です。


もちろん、必要であればロングキャストも可能です。

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

x=3;

y=3; y=4です。

 
Nikolai Semko:

もちろん、必要であればロングも可能です。

方法を宣伝しているわけですから、バカスカ真似されますよ。一般的に、何のチェックもなしにこのようにキャストすることはできません、それはUBです。

浮動実数型の有限値を_Bool以外の整数型に変換する場合、小数部は捨てられる(0に向かって切り捨てられる)。積分部の値が整数型で表現できない場合、動作は不定となる。
もしかしたら手付金を売るかもしれないし、他のことをやるかもしれない ))
 
pavlick_ :

つまり、ある方法を宣伝していると、あからさまにコピーされるわけです。確認もせずにそんなキャスティングをしたらUBですよ。

もしかしたら、内金は売り切れるかもしれないし、また何かやるかもしれない )))。

私は何も宣伝していません。アイデアを共有するそのためのフォーラムであり、ディスカッションです。

 
Dmitry Fedoseev:

x=3;

y=3; y=4です。


そうですね!ありがとうございます。 天井をどうにかしてみますね。

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

ドミトリー・フェドセーエフ

x=3;

y=3; y=4です。

をオプションとして選択することができますが、あまりきれいではありませんが、速度は同じです。

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

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

をオプションでつけると、あまり良くないですが、スピードは同じです。

それなら、x + 1 -DBL_MIN の方がいいかもしれません。または x + 1 -DBL_EPSILON.確認 てないので、試してみてください。

ああ、負の数についてはどうですか?天井と床で異なるはずです

 
Alexey Navoykov:

それなら、x + 1 -DBL_MIN の方がいいかもしれません。または x + 1 -DBL_EPSILON.確認 てないので、試してみてください。

ああ、負の数についてはどうですか?天井と床で異なるはずです

DBL_MINDBL_EPSILON は機能しません - これらは小さ すぎます。おそらく、0.99999999999(16ナイン - doubleの最大小数点数)のままにしておくのが賢明です。

そうですね、負の数には別のアルゴリズムがあるのでしょう。ありがとうございました。最初の投稿で追記を行います。

興味がある人 - 負の数の問題を解決する方法を考えることができます。個人的には、私の問題はすべて正の数に関するものなので、興味はありません。

 
Nikolai Semko:

0.99999999999999 (16ナイン - doubleの最大小数点以下の桁数) のままにするのがおそらく理にかなっています。

void OnStart()
{
        Print((int)(3.0 + 0.9999999999999999));
}
結果は確認されましたか?
 

A100:

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


はい、でも、もし。

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

であれば、問題ないでしょう。コンパイラの奇跡:))