Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Округление дробных чисел в printf(), %f 
V
    Опции темы
Pete
Дата 20.11.2008, 01:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 318
Регистрация: 5.1.2006
Где: Москва

Репутация: нет
Всего: 12



Код

#include <stdio.h>

int main( void )
{
  printf( "%.2f\n", 3.005 ); // !!!!!!!
  printf( "%.2f\n", 33.005 );
  
  return 0;
}

Output:
3.00
33.01

Код

#include <stdio.h>

int main( void )
{
  printf( "%.2f\n", 3.005f ); // !!!!!!!
  printf( "%.2f\n", 33.005f );
  
  return 0;
}

Output:
3.01
33.01

Что происходит?? smile 


--------------------
Совет учиться на ошибках других бесполезен; научиться чему-либо можно только на собственных ошибках. (Бернард Шоу)
Не откладывай на завтра то, что можешь сделать сегодня. (Пословица)
А теперь выпишем точное значение числа пи... (Препод)
Жахни, Пендальф! © Гоблин
PM   Вверх
vinter
Дата 20.11.2008, 07:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Цитата(Pete @  20.11.2008,  02:11 Найти цитируемый пост)
Что происходит??

читай про представление вещественных чисел в компьютере.


--------------------
Мой блог
PM MAIL WWW   Вверх
Pete
Дата 20.11.2008, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 318
Регистрация: 5.1.2006
Где: Москва

Репутация: нет
Всего: 12



По-моему, вопрос более конкретный. С чем связана разница поведения? В качестве какого типа трактуется константа без модификатора длины?


--------------------
Совет учиться на ошибках других бесполезен; научиться чему-либо можно только на собственных ошибках. (Бернард Шоу)
Не откладывай на завтра то, что можешь сделать сегодня. (Пословица)
А теперь выпишем точное значение числа пи... (Препод)
Жахни, Пендальф! © Гоблин
PM   Вверх
Mayk
Дата 20.11.2008, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Цитата(Pete @  20.11.2008,  16:43 Найти цитируемый пост)
В качестве какого типа трактуется константа без модификатора длины?

в качестве double. 
во-втором случае кстати printf'у тоже передается double(именно поэтому в printf'е не важно - пишется %f или %lf, в отличие от scanf), но double получается посредством расширение float'а который представляет 3.005 фиговее чем double


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Pete
Дата 21.11.2008, 00:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 318
Регистрация: 5.1.2006
Где: Москва

Репутация: нет
Всего: 12



$ man 3 printf
Код

f,F    The double argument is rounded and converted to decimal notation in the style...

Т.е. %f используется для double. Почему же тогда округление производится неправильно?

Цитата
но double получается посредством расширение float'а который представляет 3.005 фиговее чем double

Что значит "фиговее"? Указанная точность влезает в любой встроенный тип с плавающей точкой. А повышающее приведение типов всегда безопасно.


--------------------
Совет учиться на ошибках других бесполезен; научиться чему-либо можно только на собственных ошибках. (Бернард Шоу)
Не откладывай на завтра то, что можешь сделать сегодня. (Пословица)
А теперь выпишем точное значение числа пи... (Препод)
Жахни, Пендальф! © Гоблин
PM   Вверх
J0ker
Дата 21.11.2008, 00:19 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 4
Всего: 14



Цитата(Pete @ 21.11.2008,  00:02)
Цитата
но double получается посредством расширение float'а который представляет 3.005 фиговее чем double

Что значит "фиговее"? Указанная точность влезает в любой встроенный тип с плавающей точкой. А повышающее приведение типов всегда безопасно.

а где тут опасность?
было 3.005000000000001
стало 3.00499999999999999999999999999999999999999999


--------------------
user posted image
PM MAIL   Вверх
Mayk
Дата 21.11.2008, 11:53 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Цитата(Pete @  21.11.2008,  04:02 Найти цитируемый пост)
А повышающее приведение типов всегда безопасно

Осталось лишь понять что ты повысил в случае с 3.005f.
Код

    printf("%.25f %.25f\n",3.005, 3.005f);

3.0049999999999999000000000 3.0050001144409180000000000

Цитата(Pete @  21.11.2008,  04:02 Найти цитируемый пост)

Что значит "фиговее"? Указанная точность влезает в любой встроенный тип с плавающей точкой. А повышающее приведение типов всегда безопасно.

Что значит "указанная точность"?
Было во флоате  3.0050001144409180000000000, стало в дабле 3.0050001144409180000000000. double стерпит.
Хотя 3.0049999999999999000000000 в дабле гораздо ближе к 3.005. 


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Pete
Дата 21.11.2008, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 318
Регистрация: 5.1.2006
Где: Москва

Репутация: нет
Всего: 12



Понял. Всем спасибо!  smile 


--------------------
Совет учиться на ошибках других бесполезен; научиться чему-либо можно только на собственных ошибках. (Бернард Шоу)
Не откладывай на завтра то, что можешь сделать сегодня. (Пословица)
А теперь выпишем точное значение числа пи... (Препод)
Жахни, Пендальф! © Гоблин
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0755 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.