在下面的代碼:C++標準是否允許這種浮點行爲?
#include <cstdint>
#include <cinttypes>
#include <cstdio>
using namespace std;
int main() {
double xd = 1.18;
int64_t xi = 1000000000;
int64_t res1 = (double)(xi * xd);
double d = xi * xd;
int64_t res2 = d;
printf("%" PRId64"\n", res1);
printf("%" PRId64"\n", res2);
}
使用v4.9.3 g++ -std=c++14
針對32位Windows我得到的輸出:
1179999999
1180000000
難道這些值允許不同?
我預計,即使編譯器使用更高的內部精度比double
爲xi * xd
計算,就應該始終如一地做到這一點。浮點轉換中的精度損失爲實現定義的,並且此計算的精度爲實現定義的 - [c.limits]/3表示FLT_EVAL_METHOD
應該從C99導入。 IOW我預計它不應該被允許在一條線上使用不同於另一條線上的xi * xd
的精度。
注意:這是故意的C++問題而不是C問題 - 我相信這兩種語言在這方面有不同的規則。
請注意,您需要將'xi * xd'作爲'long double'並將'long double'中的整數轉換爲這個錯誤; 1e9 * 1.18比1.18e9大約1/4 ulp。 – tmyklebu
相關:https://gcc.gnu.org/bugzilla/show_bug.cgi?id=323#c127 – Nemo