тип научной записи

int s = 1e9;

Что такое тип 1e9 и насколько он точен? (Это точно равно 1000000000?)

Тип печати значения/переменной в stdout был бы полезен, если это возможно.


person a-z    schedule 28.11.2011    source источник
comment
Я считаю, что s должен быть двойным, а не целым.   -  person duffymo    schedule 28.11.2011
comment
Ага, двойной. И вы не можете напечатать тип переменной, C++ не имеет для этого средств (кажется, это называется отражением).   -  person Violet Giraffe    schedule 28.11.2011
comment
@Violet: На самом деле, это вопрос, на который мы ответили ранее.   -  person MSalters    schedule 28.11.2011


Ответы (3)


1e9 — это double, который имеет точное представление в представлении с плавающей запятой IEEE. Стандарт C++ не требует IEEE с плавающей запятой.

s — это int, поэтому значение double будет автоматически преобразовано в int. То, как это происходит, в некоторой степени зависит от реализации. В настоящее время на большинстве компьютеров это преобразование означает, что s будет присвоено начальное значение 1000000000.

person David Hammen    schedule 28.11.2011
comment
Почему он равен 1000000000? Если это настоящие научные данные, то должно быть 1,0 x e^9, это что-то другое, не так ли? Что, если мне нужна ИСТИННАЯ научная ценность? - person Gupta; 13.08.2019
comment
@Gupta - 1e9 - это сокращение от 1,0 x 10 ^ 9, а не 1,0 x e ^ 9. e в этом контексте означает показатель степени по основанию 10, а не число Эйлера e (2,718281828...). - person David Hammen; 14.08.2019

Что бы это ни стоило, вы можете написать код, который показывает, что 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;
}

Конечно, если вы не знаете, какой у него тип, потребуется немного больше усилий, чтобы обеспечить перегрузку для каждого возможного типа, но тем не менее принцип тот же.

person Jerry Coffin    schedule 28.11.2011

Если вы измените его на float или double, он будет довольно точным, но не все вычисления с ним будут точными (спасибо Керреку С.Б.), существуют пределы точности.

Обратите внимание, что точность не является свойством нотации, в любом случае, нотация является самой точностью.

person Michael Krelin - hacker    schedule 28.11.2011
comment
Вы не можете сделать никаких точных вычислений неправильно. Правильное утверждение состоит в том, что не каждое вычисление будет точным. (Например, рациональные операции, в которых знаменатель конечного результирующего значения представляет собой степень двойки, имеют хорошие шансы быть точными.) - person Kerrek SB; 28.11.2011
comment
@KerrekSB, почти согласен. Я бы предложил еще одну формулировку: вы не можете полагаться на точность каких-либо вычислений. Но, честно говоря, я думаю, что именно последний абзац действительно отвечает на вопрос. - person Michael Krelin - hacker; 28.11.2011
comment
Я не знаю. Я думаю, что вы можете полагаться на то, что 9.0 / 3.0 будет в точности 3.0... Почему бы и нет? - person Kerrek SB; 28.11.2011
comment
@KerrekSB, ну, я не говорил о вычислении хотя бы с одним неизвестным :) Кроме того, ни один из ваших операндов не равен 1e9 :P - person Michael Krelin - hacker; 28.11.2011
comment
Хм, то же самое: double x = 9.0, y = 3.0; Теперь значение x/y должно быть достоверно 3.0, нет? Я хочу сказать, что существуют вычисления, которые действительно точны и предсказуемы. (Аналогично для 1e9 / 1e8.) - person Kerrek SB; 28.11.2011
comment
Правда снова. Просто вы обычно (не всегда, вы правы) не знаете, будут ли ваши вычисления точными, если вы действительно не следите за своими шагами. Но хорошо, я отредактирую вашу формулировку. - person Michael Krelin - hacker; 28.11.2011
comment
Есть определенное ощущение, что все операции точны. Над набором значений с плавающей запятой, как определено процессором с плавающей запятой. Настоящая проблема заключается в том, что числа с плавающей запятой не являются реальными числами; не только результат может отличаться от той же операции над действительными числами, но и многие из основных законов арифметики действительных чисел, такие как ассоциативность сложения, не выполняются. - person James Kanze; 28.11.2011