2016-05-24 10 views
0

は、私はC++コードに変換する必要がありパスカル:TRUNC

var i : longint; 
    m : double; 
begin 
    ..... 
    i := trunc(m); 

古いパスカルのコードを持っています。ここ

明白なことは、

double m; 
int i; 
..... 
i = static_cast<int>(std::trunc(m)); 

を書くことです。しかし、ここでの問題は、C++のTRUNCはダブル返しながら、パスカルのTRUNCのリターンが

function trunc(
    d: ValReal 
):Int64; 

整数よりもあります。 trunc(2.3)が1.999999999999 を返し、static_castが2の代わりに1になる可能性はありますか?はいの場合は、同じパスカルの動作を得るためにtruncを使わずにstatic_castを使うのは正しいですか?

i = static_cast<int>(m); 
+0

「round()」のようなサウンドですか? – trojanfoe

+0

丸は最も近い整数を返します。あなたはstatic_cast (m)を提案するので、パスカルで私は – ArmanHunanyan

答えて

2

C++で浮動小数点値を整数値に変換すると、浮動小数点値は自動的に切り捨てられます。

は、次の簡単な例を見てみましょう:

#include <iostream> 

int main() 
{ 
    double d = 12.98; 
    int i = d; 

    std::cout << "i = " << i << '\n'; 
} 

上記のプログラムは、これらのような

 
i = 12 

変換はコンパイラによって暗黙的に行われて印刷されます。詳細については、read about implicit conversions(具体的にはread about floating-integral conversions)を入力してください。

しかし、それは(リンク参照から)注意することが重要です。

値が変換先の型に収まらない場合、動作は未定義である

だから、浮動小数点値、後代入の左側にある整数型に収まる必要があります。

+0

OKを持っていますか? – ArmanHunanyan

+0

@ArmanHunanyanキャストは必要ありません。コンパイラはそれをとにかく処理します。 –

+0

私は知っているが、私は明示的なキャストを好む。行動は同じです。ちょうどコーディングスタイル。 – ArmanHunanyan

1

doubleには、すべての整数(およびほとんどのロング?)が正確に表現できます。数学的な意味で整数を返すように定義されたtruncのような関数は、適切な戻り値がdoubleで表現できる場合、正確な整数ではないものを返すことはありません。