Форум программистов, компьютерный форум 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 знака опр число, которое рассчитывается до этого.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DKOI
 Аватар для DKOI
24 / 24 / 1
Регистрация: 08.09.2010
Сообщений: 136
15.11.2011, 12:51     округление printf("%.4f", (float) ans ); и printf("%.4lf", ans ); #2
Нет, результат может быть разный. Для функции printf что f, что lf - одно и тоже (ну почти, но в данном случае - одно и тоже). Фишка же в том, что переданный параметр неявно преобразуется в double (уже внутри самой функции), а явное преобразование во float режет точность, и могут выскочить неприятные вещи. Попробуйте в первом printf просто передавать параметр, не приводя его к float, и скажите, что получится.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16833 / 5254 / 323
Регистрация: 30.03.2009
Сообщений: 14,145
Записей в блоге: 26
15.11.2011, 13:21     округление printf("%.4f", (float) ans ); и printf("%.4lf", ans ); #3
Цитата Сообщение от DKOI Посмотреть сообщение
Для функции printf что f, что lf - одно и тоже
Не одно и то же. В первом случае аргумент double, а во втором - long double. А вообще в таких случаях лучше полный код (или фрагмент) выкладывать и внятно пояснять, что ожидалось, что напечаталось. И что вообще нужно
DKOI
 Аватар для DKOI
24 / 24 / 1
Регистрация: 08.09.2010
Сообщений: 136
15.11.2011, 13:26     округление printf("%.4f", (float) ans ); и printf("%.4lf", ans ); #4
Цитата Сообщение от Evg Посмотреть сообщение
Не одно и то же. В первом случае аргумент double, а во втором - long double. А вообще в таких случаях лучше полный код (или фрагмент) выкладывать и внятно пояснять, что ожидалось, что напечаталось. И что вообще нужно
Я и написал - почти В данном случае, учитывая, что передается double - что так, что так, по идее, должно быть фиолетово, что использовать. Хотя, например, у меня второй вариант с double не работает в принципе, только с long double.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16833 / 5254 / 323
Регистрация: 30.03.2009
Сообщений: 14,145
Записей в блоге: 26
15.11.2011, 14:15     округление printf("%.4f", (float) ans ); и printf("%.4lf", ans ); #5
Цитата Сообщение от DKOI Посмотреть сообщение
что передается double - что так, что так, по идее, должно быть фиолетово
Не так. Во втором случае передаётся double, в то время как ожидается long double. И в качестве экспоненты передаётся мусор, что в итоге приводит к неправильной печати
DKOI
 Аватар для DKOI
24 / 24 / 1
Регистрация: 08.09.2010
Сообщений: 136
15.11.2011, 14:41     округление printf("%.4f", (float) ans ); и printf("%.4lf", ans ); #6
Так у человека второй способ работает, а первый - нет
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16833 / 5254 / 323
Регистрация: 30.03.2009
Сообщений: 14,145
Записей в блоге: 26
15.11.2011, 14:43     округление printf("%.4f", (float) ans ); и printf("%.4lf", ans ); #7
Цитата Сообщение от DKOI Посмотреть сообщение
Так у человека второй способ работает, а первый - нет
Не видя исходников и постановки задачи, тут можно только гадать
-=ЮрА=-
15.11.2011, 14:52
  #8

Не по теме:

Цитата Сообщение от DKOI Посмотреть сообщение
Для функции printf что f, что lf - одно и тоже (ну почти, но в данном случае - одно и тоже)
- нет это не так, f подразумевает максимальную точность float читайте макс вывод 6 цифр после запятой lf подразумевает вывод под точность double т.е. если будет 11-й знак printf со спецификатором lf его тоже выведет

AC-93
13 / 13 / 0
Регистрация: 27.01.2010
Сообщений: 150
15.11.2011, 15:02  [ТС]     округление printf("%.4f", (float) ans ); и printf("%.4lf", ans ); #9
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#pragma warning (disable:4996)
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
 
 
 
 
int main()
{
    int N, i;
    int t;
    unsigned long long sum = 0, pr = 1;
    double ans = 0;
 
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
    scanf("%d", &N);
    for (i = 0; i < N; i++)
    {
        scanf("%d", &t);
        ans += ((double)1000)/t;
    }
    ans = ((double)1000*N) / ans ;
    printf("%.4lf", ans );
 
 
 
 
 
    return 0;
}
Имя входного файла: input.txt
Имя выходного файла: output.txt
Максимальное время работы на одном тесте: 1секунда
Максимальный объем используемой памяти: 64 мегабайт

Михаэль и Ральф Шумахеры решили помериться силами, проехав новую
китайскую трассу ―Long-long Gonk‖. Ральф подумал, что разобьет трассу на равные
интервалы, и каждый из них будет проходить с разной скоростью, выбирая оптимальную
скорость для каждого участка пути. Михаэль, в свою очередь, решил, что лучше всю
трассу проехать с одинаковой скоростью. В результате оба брата финишировали
одновременно. Необходимо, зная скорость Ральфа Шумахера на каждом участке трассы,
определить, с какой скоростью трассу прошел Михаэль Шумахер.
Формат входных данных
В первой строке входного файла задано целое число N — количество участков
трассы, на границах которых менял скорость Ральф Шумахер (1  N  100 000).
Во второй строке через пробел записаны целые числа Vi (i = 1..N), каждое из
которых соответствует скорости болида Ральфа на i-м участке (1  Vi  10
9
).
Формат выходных данных
В выходной файл ваша программа должна вывести одно число — скорость болида Михаэля Шумахера в этой гонке с точностью до
четырѐх знаков после десятичной точки.
-=ЮрА=-
Заблокирован
Автор FAQ
15.11.2011, 15:07     округление printf("%.4f", (float) ans ); и printf("%.4lf", ans ); #10
Стоп что я вижу 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
Что за хр*нь с 6-ю цифрами
Всю жизнь работал с lf для дабла f для float и тут такое
DKOI, я приношу вам свои извинения!
AC-93
13 / 13 / 0
Регистрация: 27.01.2010
Сообщений: 150
15.11.2011, 15:07  [ТС]     округление printf("%.4f", (float) ans ); и printf("%.4lf", ans ); #11
мое понимание:
рабочий вариант - передаю в функцию дабл, потом округляю его до 4 знаков после запятой.
другой вариант - округляю дабл до флоата, потом округляю до 4 знаков после запятой. При этом флоат определяет с точностью больше 6 знаков после запятой, т.е. мы сначала округляем более точно, а потом грубо до 4 знаков.
пример есть число 0.0004899999 в дабле, переводим во флоат получаем 0.000490, выводим первые 4 получаем 0.0005
или сразу выводим дабл и тоже 0.0005

тесты привести не могу, т.к. вижу только результат, а не сами тесты.
-=ЮрА=-
Заблокирован
Автор FAQ
15.11.2011, 15:08     округление printf("%.4f", (float) ans ); и printf("%.4lf", ans ); #12
Цитата Сообщение от AC-93 Посмотреть сообщение
ans += ((double)1000)/t;
- запишите ans += (1000.0)/t; а также
Цитата Сообщение от AC-93 Посмотреть сообщение
ans = ((double)1000*N) / ans ;
ans = (1000.0*N); єтим ві неянов преобразуете к даблу...
AC-93
13 / 13 / 0
Регистрация: 27.01.2010
Сообщений: 150
15.11.2011, 15:11  [ТС]     округление printf("%.4f", (float) ans ); и printf("%.4lf", ans ); #13
пробовал, ошибка именно в момент вывода. Остальная часть идентична в рабочей и не совсем версиях.
-=ЮрА=-
Заблокирован
Автор FAQ
15.11.2011, 15:12     округление printf("%.4f", (float) ans ); и printf("%.4lf", ans ); #14
Вот код
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
 
int main()
{
        int N, i;
        int t;
        double ans = 0;
 
        freopen("input.txt", "r", stdin);
        scanf("%d", &N);
        for (i = 0; i < N; i++)
        {
                scanf("%d", &t);
                ans += (1000.0)/t;
        }
        ans = (1000.0*N)/ans ;
        printf("%.4lf\n", ans );
        system("pause");
        return 0;
}
input.txt
10
1 2 3 4 5 6 7 8 9 10
Миниатюры
округление printf("%.4f", (float) ans );  и printf("%.4lf", ans );  
AC-93
13 / 13 / 0
Регистрация: 27.01.2010
Сообщений: 150
15.11.2011, 15:14  [ТС]     округление printf("%.4f", (float) ans ); и printf("%.4lf", ans ); #15
Скажите зачем вы написали мне решение? Я уже сдал задачу на 100 баллов, мне просто нужно понять разницу между двумя моими принтфами, ибо я ее не вижу.
-=ЮрА=-
Заблокирован
Автор FAQ
15.11.2011, 15:20     округление printf("%.4f", (float) ans ); и printf("%.4lf", ans ); #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
13 / 13 / 0
Регистрация: 27.01.2010
Сообщений: 150
15.11.2011, 15:22  [ТС]     округление printf("%.4f", (float) ans ); и printf("%.4lf", ans ); #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
13 / 13 / 0
Регистрация: 27.01.2010
Сообщений: 150
15.11.2011, 15:23  [ТС]     округление printf("%.4f", (float) ans ); и printf("%.4lf", ans ); #19
Плз не отходите от темы, я не хотел отвлекать задачей и условием. 2 строчки два принтфа, все.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.11.2011, 15:25     округление printf("%.4f", (float) ans ); и printf("%.4lf", ans );
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16833 / 5254 / 323
Регистрация: 30.03.2009
Сообщений: 14,145
Записей в блоге: 26
15.11.2011, 15:25     округление printf("%.4f", (float) ans ); и printf("%.4lf", ans ); #20
Я тоже накосячил. long double - это "Lf", а не "lf"

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


Ссылка из поста #10 несколько непонятная. Но если она верна, то подразумевается, что f полагает, что аргумент float, а lf - double. При этом аргумент float при передаче в printf в качестве неявного аргумента ВСЕГДА преобразуется к double (по стандарту Си, плавающий promotion)
Yandex
Объявления
15.11.2011, 15:25     округление printf("%.4f", (float) ans ); и printf("%.4lf", ans );
Ответ Создать тему
Опции темы

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