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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 58, средняя оценка - 4.72
AC-93
16 / 16 / 0
Регистрация: 27.01.2010
Сообщений: 150
#1

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

15.11.2011, 12:30. Просмотров 7937. Ответов 30
Метки нет (Все метки)

printf("%.4f", (float) ans );
printf("%.4lf", ans );
вроде по моему пониманию мы должны на выходе получать одно и то же (анс в начале дабл).
но т.к. это олимпиада протестил 1 и 2 вариант, 2 дал 100 баллов, 1 24 балла, не понимаю где так жестоко косится ответ.
P.S. задача вывести с точностью 4 знака опр число, которое рассчитывается до этого.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.11.2011, 12:30
Здравствуйте! Я подобрал для вас темы с ответами на вопрос округление printf("%.4f", (float) ans ); и printf("%.4lf", ans ); (C++):

"cin","cout" на "printf","scanf" - C++
Вот ещё прога. Мне чисто нужно переделать её на printf,scanf и не используя функцию show, а puts и gets. #include <iostream> using...

В зависимости от времени года "весна", "лето", "осень", "зима" определить погоду "тепло", "жарко", "холодно", "очень холодно" - C++
В зависимости от времени года "весна", "лето", "осень", "зима" определить погоду "тепло", "жарко", "холодно", "очень холодно". Я так...

Как заменить функцию printf из "С" в "С++"? - C++
Я знаю, что саму функцию printf можно заменить функцией cout, но меня интересует как заменить то, что в скобках? printf("%4d",a); ...

Ошибки в выводе типа if (string != "0") printf("%s, ", string) - C++
Имеется класс "почтовый адрес", поля - string и int. Необходимо сделать так, чтобы при печати выводились только поля с содержимым != 0....

Реализовать классы "Воин", "Пехотинец", "Винтовка", "Матрос", "Кортик" (наследование) - C++
Разработать программу с использованием наследования классов, реализующую классы: − воин; − пехотинец(винтовка); − матрос(кортик). ...

printf("Hello, CyberForum.ru!!!\n"); //несколько вопросов от начинающего программиста - C++
Доброго времени суток ! Хотел бы получить советы от опытных программеров ) 1) Начали на 1 курсе сразу с языка Си (до этого дела даже с...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
-=ЮрА=-
Заблокирован
Автор FAQ
15.11.2011, 15:20 #16
Цитата Сообщение от AC-93 Посмотреть сообщение
Скажите зачем вы написали мне решение? Я уже сдал задачу на 100 баллов, мне просто нужно понять разницу между двумя моими принтфами, ибо я ее не вижу.
- как я понял по ссылке в 10-м посте разницы получается нет

Не по теме:

Цитата Сообщение от AC-93 Посмотреть сообщение
Я уже сдал задачу на 100 баллов
- вы могли сдать её и на 200 только смотрите, ваш ввод никак не защищён, я говорю
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
scanf("%d", &t);
об этом. А если в файле N будет записано как 128 а циферей будет 126 что тогда?
Цикл лучше было посторить так
C++
1
2
3
4
5
6
7
for (i = 0; i < N && !feof(stdin); i++)
        {
                scanf("%d", &t);
                ans += (1000.0)/t;
        }
        if(i != N)
            printf("input.txt has less data!\n");
input.txt has less data!
3.6794
Для продолжения нажмите любую клавишу . . .

input.txt
10
1 2 3 4 5 6 7 8

AC-93
16 / 16 / 0
Регистрация: 27.01.2010
Сообщений: 150
15.11.2011, 15:22  [ТС] #17
Это олимпиадная задача, тут корректные входные данные..
-=ЮрА=-
15.11.2011, 15:23
  #18

Не по теме:

Evg, Вы экспертны я это знаю просветите меня почему нет разницы между f и lf я просто в ступоре от

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Стоп что я вижу http://www.dgp.toronto.edu/~ajr/209/notes/printf.html
f float [footnote] number with six digits of precision
lf double [footnote] number with six digits of precision
У меня реально мировоззрение крах потерпело - пожалуйсто отзовитесь!

AC-93
16 / 16 / 0
Регистрация: 27.01.2010
Сообщений: 150
15.11.2011, 15:23  [ТС] #19
Плз не отходите от темы, я не хотел отвлекать задачей и условием. 2 строчки два принтфа, все.
Evg
Эксперт CАвтор FAQ
17633 / 5857 / 377
Регистрация: 30.03.2009
Сообщений: 16,155
Записей в блоге: 26
15.11.2011, 15:25 #20
Я тоже накосячил. long double - это "Lf", а не "lf"

Вот более-менее подробное описание http://linux.die.net/man/3/printf
Из описания printf'а получается, что "l" имеет смысл только для целочисленных аргументов
Т.е. "lf" - это по сути некорректный код. Но ошибка вполне себе может и игнорироваться.


Ссылка из поста #10 несколько непонятная. Но если она верна, то подразумевается, что f полагает, что аргумент float, а lf - double. При этом аргумент float при передаче в printf в качестве неявного аргумента ВСЕГДА преобразуется к double (по стандарту Си, плавающий promotion)
-=ЮрА=-
Заблокирован
Автор FAQ
15.11.2011, 15:29 #21
Evg, спасибо теперь мне стало ясней
Цитата Сообщение от AC-93 Посмотреть сообщение
Плз не отходите от темы, я не хотел отвлекать задачей и условием. 2 строчки два принтфа, все.
- получается что разницы нет
printf("%.4f", (float) ans ); и printf("%.4lf", ans );, дайте пожалуйста для анализа исходные данные при которых у вас не работало!
Evg
Эксперт CАвтор FAQ
17633 / 5857 / 377
Регистрация: 30.03.2009
Сообщений: 16,155
Записей в блоге: 26
15.11.2011, 15:34 #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
16 / 16 / 0
Регистрация: 27.01.2010
Сообщений: 150
15.11.2011, 15:41  [ТС] #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
Эксперт CАвтор FAQ
17633 / 5857 / 377
Регистрация: 30.03.2009
Сообщений: 16,155
Записей в блоге: 26
15.11.2011, 15:43 #24
2-ю или 3-ю строку надо заменить на "%lf", а то они полностью одинаковые
AC-93
16 / 16 / 0
Регистрация: 27.01.2010
Сообщений: 150
15.11.2011, 15:45  [ТС] #25
но на scanf
scanf("%lf", &ans);
scanf("%f", &ans);
абсолютно разные вещи, т.к. второй вариант просто не будет работать, не странно ли?
-=ЮрА=-
Заблокирован
Автор FAQ
15.11.2011, 16:28 #26
Цитата Сообщение от AC-93 Посмотреть сообщение
не странно ли?
- поэтому я и писал
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Всю жизнь работал с lf для дабла f для float и тут такое
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
почему нет разницы между f и lf я просто в ступоре от
У меня реально мировоззрение крах потерпело!
Evg
Эксперт CАвтор FAQ
17633 / 5857 / 377
Регистрация: 30.03.2009
Сообщений: 16,155
Записей в блоге: 26
15.11.2011, 16:32 #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
24 / 24 / 1
Регистрация: 08.09.2010
Сообщений: 136
15.11.2011, 18:36 #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
Эксперт CАвтор FAQ
17633 / 5857 / 377
Регистрация: 30.03.2009
Сообщений: 16,155
Записей в блоге: 26
15.11.2011, 18:39 #29
Мда... не заметил
DKOI
24 / 24 / 1
Регистрация: 08.09.2010
Сообщений: 136
15.11.2011, 18:42 #30
Ничего Со всеми бывает
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.11.2011, 18:42
Привет! Вот еще темы с ответами:

Что означают символы в скобках: printf (" %2d%7.2f ",t);??? (-) - C++
---

Создать класс "Вентилятор" содержащий в себе классы: "Двигатель", "Контроллер", "Пульт управления" - C++
Помогите с кодом написания задачи, не понимаю как написать классы в классе. Нужно создать класс &quot;вентилятор&quot; содержащий в себе классы:...

Создать класс "Книга" с полями "название книги", "количество страниц", "год издания" - C++
Создать класс Книга поля: название книги,количество страниц,год издания методы: вычислить сколько лет книге и количество дней прошедших...

Создать абстрактный класс "Издание" и производные классы "Книга", "Статья", "Электронный ресурс" - C++
1. Создать абстрактный класс Издание с методами, позволяющими вывести на экран информацию об издании, а также определить является ли данное...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
15.11.2011, 18:42
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru