Форум программистов, компьютерный форум CyberForum.ru

округление printf("%.4f", (float) ans ); и printf("%.4lf", ans ); - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 58, средняя оценка - 4.72
AC-93
13 / 13 / 0
Регистрация: 27.01.2010
Сообщений: 150
15.11.2011, 12:30     округление printf("%.4f", (float) ans ); и printf("%.4lf", ans ); #1
printf("%.4f", (float) ans );
printf("%.4lf", ans );
вроде по моему пониманию мы должны на выходе получать одно и то же (анс в начале дабл).
но т.к. это олимпиада протестил 1 и 2 вариант, 2 дал 100 баллов, 1 24 балла, не понимаю где так жестоко косится ответ.
P.S. задача вывести с точностью 4 знака опр число, которое рассчитывается до этого.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
-=ЮрА=-
Заблокирован
Автор FAQ
15.11.2011, 15:29     округление printf("%.4f", (float) ans ); и printf("%.4lf", ans ); #21
Evg, спасибо теперь мне стало ясней
Цитата Сообщение от AC-93 Посмотреть сообщение
Плз не отходите от темы, я не хотел отвлекать задачей и условием. 2 строчки два принтфа, все.
- получается что разницы нет
printf("%.4f", (float) ans ); и printf("%.4lf", ans );, дайте пожалуйста для анализа исходные данные при которых у вас не работало!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 320
Регистрация: 30.03.2009
Сообщений: 14,125
Записей в блоге: 26
15.11.2011, 15:34     округление printf("%.4f", (float) ans ); и printf("%.4lf", ans ); #22
Возьмём такой пример:

C
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
 
double D = 1.234567891234567812345678;
 
int main (void)
{
  printf ("%.90f\n", (double)(float)D);
  printf ("%.90f\n", D);
  printf ("%.90lf\n", D);
  return 0;
}
На печать выведется:

Код
1.234567880630493164062500000000000000000000000000000000000000000000000000000000000000000000
1.234567891234567893476992139767389744520187377929687500000000000000000000000000000000000000
1.234567891234567893476992139767389744520187377929687500000000000000000000000000000000000000
Таким образом в ссылке из поста 10 либо врут, либо glibc (с которой линковался данный пример) работает не по стандарту. Потому что тут явно видно, что "f" ну никак не пытается привести аргумент к типу float (2-ой printf), потому что в этом случае мы бы увидели на печати то, что выдал 1-й printf.

Добавлено через 47 секунд
И сентенция такая, что "%f" отрабатывает так же, как и "%lf"
AC-93
13 / 13 / 0
Регистрация: 27.01.2010
Сообщений: 150
15.11.2011, 15:41  [ТС]     округление printf("%.4f", (float) ans ); и printf("%.4lf", ans ); #23
ans = 0.009450;
printf("\n%.4lf", ans );
printf("\n%.4f", (float)ans );
printf("\n%.4lf", (float)ans );
printf("\n%.4f", ans );
получаем
0.0095
0.0094
0.0094
0.0095
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 320
Регистрация: 30.03.2009
Сообщений: 14,125
Записей в блоге: 26
15.11.2011, 15:43     округление printf("%.4f", (float) ans ); и printf("%.4lf", ans ); #24
2-ю или 3-ю строку надо заменить на "%lf", а то они полностью одинаковые
AC-93
13 / 13 / 0
Регистрация: 27.01.2010
Сообщений: 150
15.11.2011, 15:45  [ТС]     округление printf("%.4f", (float) ans ); и printf("%.4lf", ans ); #25
но на scanf
scanf("%lf", &ans);
scanf("%f", &ans);
абсолютно разные вещи, т.к. второй вариант просто не будет работать, не странно ли?
-=ЮрА=-
Заблокирован
Автор FAQ
15.11.2011, 16:28     округление printf("%.4f", (float) ans ); и printf("%.4lf", ans ); #26
Цитата Сообщение от AC-93 Посмотреть сообщение
не странно ли?
- поэтому я и писал
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Всю жизнь работал с lf для дабла f для float и тут такое
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
почему нет разницы между f и lf я просто в ступоре от
У меня реально мировоззрение крах потерпело!
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 320
Регистрация: 30.03.2009
Сообщений: 14,125
Записей в блоге: 26
15.11.2011, 16:32     округление printf("%.4f", (float) ans ); и printf("%.4lf", ans ); #27
Цитата Сообщение от AC-93 Посмотреть сообщение
но на scanf
scanf("%lf", &ans);
scanf("%f", &ans);
абсолютно разные вещи, т.к. второй вариант просто не будет работать, не странно ли?
Нет, не странно. В scanf передаётся указатель в отличие от printf'а, а потому никакого promotion'а нет. Т.е. в случае printf'а нет физической возможности дотащить значение типа float до самого printf'а, потому что в момент передачи он будет расширен до double'а. А указатель он и есть указатель

http://linux.die.net/man/3/scanf
И тут действительно "f" означает float, а "lf" - double. Так что товарищи по ссылке из поста 10 накосячили. Оно посчитали, что printf и scanf сделаны полностью симметрично. Ан нет
DKOI
 Аватар для DKOI
24 / 24 / 1
Регистрация: 08.09.2010
Сообщений: 136
15.11.2011, 18:36     округление printf("%.4f", (float) ans ); и printf("%.4lf", ans ); #28
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
DKOI, я приношу вам свои извинения!
-=ЮрА=-, Ничего страшного Я сам удивился, когда прочитал об этом, кстати на том же сайте, что и вы

Цитата Сообщение от Evg Посмотреть сообщение
И тут действительно "f" означает float, а "lf" - double. Так что товарищи по ссылке из поста 10 накосячили. Оно посчитали, что printf и scanf сделаны полностью симметрично. Ан нет
Footnote: In printf(), the rvalue type promotions are expected. Thus %c actually corresponds to a parameter of type int and %f and %g actually correspond to parameters of type double. Thus in printf() there is no difference between %f and %lf, or between %g and %lg. However, in scanf() what is passed is a pointer to the variable so no rvalue type promotions occur or are expected. Thus %f and %lf are quite different in scanf, but the same in printf.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 320
Регистрация: 30.03.2009
Сообщений: 14,125
Записей в блоге: 26
15.11.2011, 18:39     округление printf("%.4f", (float) ans ); и printf("%.4lf", ans ); #29
Мда... не заметил
DKOI
 Аватар для DKOI
24 / 24 / 1
Регистрация: 08.09.2010
Сообщений: 136
15.11.2011, 18:42     округление printf("%.4f", (float) ans ); и printf("%.4lf", ans ); #30
Ничего Со всеми бывает
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.11.2011, 18:46     округление printf("%.4f", (float) ans ); и printf("%.4lf", ans );
Еще ссылки по теме:

C++ необъявленный идентификатор,преобразование "int" в "float"
Warning C4244: =: преобразование "double" в "float", возможна потеря данных C++
"Чудеса типа float" или "Куда девалась информация?" C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
-=ЮрА=-
15.11.2011, 18:46     округление printf("%.4f", (float) ans ); и printf("%.4lf", ans );
  #31

Не по теме:

Цитата Сообщение от DKOI Посмотреть сообщение
Thus %f and %lf are quite different in scanf, but the same in printf.
исчерпывающе!

Yandex
Объявления
15.11.2011, 18:46     округление printf("%.4f", (float) ans ); и printf("%.4lf", ans );
Ответ Создать тему
Опции темы

Текущее время: 22:23. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru