Форум программистов, компьютерный форум 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. Просмотров 7942. Ответов 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 курсе сразу с языка Си (до этого дела даже с...

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

Не по теме:

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

AC-93
16 / 16 / 0
Регистрация: 27.01.2010
Сообщений: 150
15.11.2011, 15:02  [ТС] #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 #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
16 / 16 / 0
Регистрация: 27.01.2010
Сообщений: 150
15.11.2011, 15:07  [ТС] #11
мое понимание:
рабочий вариант - передаю в функцию дабл, потом округляю его до 4 знаков после запятой.
другой вариант - округляю дабл до флоата, потом округляю до 4 знаков после запятой. При этом флоат определяет с точностью больше 6 знаков после запятой, т.е. мы сначала округляем более точно, а потом грубо до 4 знаков.
пример есть число 0.0004899999 в дабле, переводим во флоат получаем 0.000490, выводим первые 4 получаем 0.0005
или сразу выводим дабл и тоже 0.0005

тесты привести не могу, т.к. вижу только результат, а не сами тесты.
-=ЮрА=-
Заблокирован
Автор FAQ
15.11.2011, 15:08 #12
Цитата Сообщение от AC-93 Посмотреть сообщение
ans += ((double)1000)/t;
- запишите ans += (1000.0)/t; а также
Цитата Сообщение от AC-93 Посмотреть сообщение
ans = ((double)1000*N) / ans ;
ans = (1000.0*N); єтим ві неянов преобразуете к даблу...
AC-93
16 / 16 / 0
Регистрация: 27.01.2010
Сообщений: 150
15.11.2011, 15:11  [ТС] #13
пробовал, ошибка именно в момент вывода. Остальная часть идентична в рабочей и не совсем версиях.
-=ЮрА=-
Заблокирован
Автор FAQ
15.11.2011, 15:12 #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
16 / 16 / 0
Регистрация: 27.01.2010
Сообщений: 150
15.11.2011, 15:14  [ТС] #15
Скажите зачем вы написали мне решение? Я уже сдал задачу на 100 баллов, мне просто нужно понять разницу между двумя моими принтфами, ибо я ее не вижу.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.11.2011, 15:14
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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