[英]Casting float to int in C++
int uniquePaths(int m, int n) {
int num = m+n-2;
int den=1;
double ans = 1;
while(den<=m-1) {
ans = ans*(num--)/(den++);
}
cout<<ans;
return (int)ans;
}
作為上述代碼段輸入的 m=53、n=4 的預期答案是 26235,但代碼返回 26234。但是,stdout 顯示 26235。
你能幫我理解這種行為嗎?
由於浮點舍入,您的代碼計算出ans
為 26,234.999999999985448084771633148193359375。 當使用cout<<ans
打印時,默認格式不顯示完整值並將其四舍五入為“26235”。 但是,當實際值轉換為int
時,結果為 26,234。
將num
設置為m+n-2
后,您的代碼正在計算num
! / (( m-1
)!( num-m+1
),), 當然等於num
! / (( num-m+1
)!( m-1
).),因此,您可以使用m-1
或num-m+1
作為極限。 因此,您可以將while
行更改為這兩行:
int limit = m-1 < num-m+1 ? m-1 : num-m+1;
while(den<=limit) {
然后你的代碼將運行到下限,這將避免將ans
除以尚未包含的因素。 所有結果都將是精確的 integer 結果,沒有舍入錯誤,除非您嘗試計算的結果超出double
精度格式的范圍,在該范圍內它能夠表示所有整數(在使用的無處不在的 IEEE-754 binary64 格式中最多為 2 53對於double
)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.