int s = 1e9;
Что такое тип 1e9
и насколько он точен? (Это точно равно 1000000000?)
Тип печати значения/переменной в stdout
был бы полезен, если это возможно.
int s = 1e9;
Что такое тип 1e9
и насколько он точен? (Это точно равно 1000000000?)
Тип печати значения/переменной в stdout
был бы полезен, если это возможно.
1e9
— это double
, который имеет точное представление в представлении с плавающей запятой IEEE. Стандарт C++ не требует IEEE с плавающей запятой.
s
— это int
, поэтому значение double
будет автоматически преобразовано в int
. То, как это происходит, в некоторой степени зависит от реализации. В настоящее время на большинстве компьютеров это преобразование означает, что s
будет присвоено начальное значение 1000000000.
Что бы это ни стоило, вы можете написать код, который показывает, что 1e9
имеет тип double
:
#include <iostream>
void show_type(double value) {
std::cout << "type = double\n";
}
void show_type(...) {
std::cout << "Type != double\n";
}
int main() {
show_type(1e9);
return 0;
}
Конечно, если вы не знаете, какой у него тип, потребуется немного больше усилий, чтобы обеспечить перегрузку для каждого возможного типа, но тем не менее принцип тот же.
Если вы измените его на float
или double
, он будет довольно точным, но не все вычисления с ним будут точными (спасибо Керреку С.Б.), существуют пределы точности.
Обратите внимание, что точность не является свойством нотации, в любом случае, нотация является самой точностью.
9.0 / 3.0
будет в точности 3.0
... Почему бы и нет?
- person Kerrek SB; 28.11.2011
double x = 9.0, y = 3.0;
Теперь значение x/y
должно быть достоверно 3.0
, нет? Я хочу сказать, что существуют вычисления, которые действительно точны и предсказуемы. (Аналогично для 1e9 / 1e8
.)
- person Kerrek SB; 28.11.2011