У меня есть один двойной и один int64_t. Я хочу знать, имеют ли они одно и то же значение, и если преобразование одного типа в другое не потеряет никакой информации.
Моя текущая реализация такова:
int int64EqualsDouble(int64_t i, double d) {
return (d >= INT64_MIN)
&& (d < INT64_MAX)
&& (round(d) == d)
&& (i == (int64_t)d);
}
Мой вопрос: правильно ли эта реализация? А если нет, то что будет правильным ответом? Чтобы быть верным, он не должен оставлять ложных срабатываний и не иметь ложных отрицательных результатов.
Некоторые примеры ввода:
- int64EqualsDouble (0, 0.0) должен возвращать 1
- int64EqualsDouble (1, 1.0) должен возвращать 1
- int64EqualsDouble (0x3FFFFFFFFFFFFFFF, (double) 0x3FFFFFFFFFFFFFFF) должен возвращать 0, потому что 2 ^ 62 - 1 может быть точно представлен с int64_t, но не с двойным.
- int64EqualsDouble (0x4000000000000000, (double) 0x4000000000000000) должен возвращать 1, потому что 2 ^ 62 может быть точно представлен как в int64_t, так и в double.
- int64EqualsDouble (INT64_MAX, (double) INT64_MAX) должен возвращать 0, поскольку INT64_MAX не может быть точно представлен как двойной
- int64EqualsDouble (..., 1.0e100) должен возвращать 0, потому что 1.0e100 не может быть точно представлен как int64_t.