這取決於表達式的寫法。
如果你這樣寫:
my_large_double/my_large_int1/my_large_int2
那麼它等同於:
(my_large_double/my_large_int1)/my_large_int2
這應該給你相當準確的結果; my_large_int1
在第一部分之前被提升爲double
,並且my_large_int2
在第二部分之前被提升爲double
。
如果你這樣寫:
my_large_double/(my_large_int1 * my_large_int2)
然後乘兩個整數變量的類型進行,並根據它們的值,你可以有溢出(它可以給你比一個更小的值數學產品 - 儘管嚴格來說,有符號整數溢出的行爲是未定義的)。
要記住的重要的事情是,在大多數情況下,每個C表達是有效地隔離評價;它的類型不受其出現的上下文的影響。表達式my_large_int1 * my_large_int2
是整數乘法,即使結果是浮點除法的操作數或分配給浮點變量。
操作數都是整數的任何操作都是整數操作。如果一個操作數是double
,另一個是int
,該int
操作數提升爲double
。
即使這樣:
double temp = my_large_int1 * my_large_int2;
... my_large_double/temp ...
將使用該結果來初始化temp
之前執行的整數乘法,以及這樣的:
my_large_double/(double)(my_large_int1 * my_large_int2)
有同樣的問題。
正如您看到的,該解決方案是投整數操作數的一個或兩個double
:
my_large_double/((double)my_large_int1 * (double)my_large_int2)
(你還不如投他們兩個,只是爲了對稱和透明度。)
可能是由於環回,因爲在int的最大值可能會達到,所以它迴環 – AsG
@john經驗告訴我,它解決了問題,如果你想嘗試在你身邊。 – Liam
我相信您的問題已經在這裏找到答案: http://stackoverflow.com/questions/3051135/dividing-a-double-with-integer –