2015-06-19 4 views
-1

Таким образом у меня есть этот кодпочему соиЬ удалить замыкающие нули для чисел с плавающей точкой

template <typename T, typename T2> 
void print (const T& a, const T2& b) 
{ 
cout << a<<endl<<b<<endl ; 
} 

int main(){ 
float i=1.002; 
float j=1.000; 
print(i,j); 

return 0; 
} 

выход

1.002 
1 

, что я не получаю почему соиЬ удалить нули, хотя у меня есть указали их во время инициализации, я знаю, что это не будет иметь никакого значения, но им просто интересно, почему это происходит.

+5

«хотя я указал их во время« Нет, у вас нет ». При компиляции '1.000' точно так же, как' 1.0''' 1.00000000000000000'. – Kryptos

+0

@rahul У вас, похоже, есть серьезные заблуждения относительно представления данных и как они преобразуются в текст, читаемый человеком. –

+0

haha ​​no no Я просто хотел узнать, есть ли какая-то конкретная причина по этому поводу, глядя на вывод cout, который вы не можете определить, если его float или int или double .i знает, как float или ints или подписанные числа или беззнаковые числа хранящиеся в памяти –

ответ

4

Из-за способа хранения номера.

В представлении с плавающей точкой IEEE отсутствует понятие значимых цифр. Числа 1.0 или 1.000 выглядят одинаково в двоичной нотации.

Вы должны указать точность при печати.

Python, например, имеет тип Decimal, который ведет себя так, как вы хотите.

+0

Да, этот вопрос возник в моем ум после просмотра слова python и auto в C++ 11 std. –

4
  • Потому что это по дизайну ...?
  • Обычно нам не нравится бесполезная информация в этом мире.
  • И поскольку 1.000 == 1.
+0

Я получаю это, но вы можете избежать сарказма, я специально сказал в вопросе, что это не имеет никакого значения. Я просто хотел узнать, есть ли что-то в документации об этом –

2

Ожидая, что ваш код будет печатать эти завершающие нули, ничем не отличается от ожидающего его печати 5.0 - 4.0 только потому, что вы инициализировали переменную как float j = 5.0 - 4.0;.

С точки зрения представления с плавающей точкой нет такой вещи, как «Я указывал конечные нули во время инициализации». Номера с плавающей запятой не являются строками. Это цифры. И есть бесконечные разные способы выразить то же число, что и последовательность человекочитаемых символов в тексте вашей программы. В исходном коде программы 1.000 совпадает с 1.00 и совпадает с 0.1e1 - все они представляют одинаковое число.

Это означает, что когда придет время преобразовать число с плавающей запятой обратно в текстовое представление для cout, библиотека не будет знать (и не заботится), какой текст вы использовали первоначально. Вы можете влиять на текстовый вывод, изменяя данные точности, ширины и других форматов (например, использовать научный формат и т. Д.), Но нет такой вещи, как «вывести ее так же, как я написал ее в исходном коде».

0

Зачем ему печатать 1.000 вместо 1.0000000000000000? Оба эти числа являются одинаковыми точными битами в памяти. (Другими словами, значение float хранится как 32-бит в очень специфическом формате. Независимо от того, является ли оно 1,0 или -59.12391, это где-то в 32-битных данных.)

Если вы хотите, чтобы печататься определенным образом, используйте спецификаторы форматирования, такие как setw() (не забудьте указать #include<iomanip>), чтобы отформатировать ваш вывод cout определенным образом.

+0

так вот почему вы уверены? –