Форум программистов, компьютерный форум, киберфорум
Наши страницы

Теряется точность - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Цикл for http://www.cyberforum.ru/cpp-beginners/thread344707.html
#include <iostream> #include <string> using namespace std; int main () { //////////////////////////////////////////////////////// // Îòîáðàæåíèå ñëîâà íà îáîðîò. Íå ìîãó...
C++ Операции инкремента и декремента (префиксная и постфиксная версия). Подскажите. #include <iostream> #include <string> using namespace std; int main () { setlocale(LC_ALL, "rus"); http://www.cyberforum.ru/cpp-beginners/thread344700.html
Бинарная запись массива строк в фаил C++
Добрый день появился вопрос, как можно записать массив String** в бинарный фаил я сначала записываю длину текста, а потом пишу сам текст int temp; TEXT.write((char *) & (temp =...
C++ Спичечная модель
Спичечная модель Профессор Самоделкин решил изготовить объемную модель кубиков из спичек, используя спички для рёбер кубиков. Длина ребра каждого кубика равна одной спичке. Для...
C++ Говорят Compilation error http://www.cyberforum.ru/cpp-beginners/thread344645.html
Решаю задачи на сайте ******** раньше решал на Паскале, сейчас решил учить С++... пытаюсь решить эту задачу http://********/?main=task&id_task=5 Решил у меня ответ пишется, но на сайте когда сдаю...
C++ Найти длину такого первого идентификатора в строку, в котором произведение всех четных цифр максимально решите плиз кому не трудно очень нужно... Задана последовательность идентификаторов, разделенных сериями пробелов. Последовательность задана строкой символов (string) заканчивается символом ‘*’.... подробнее

Показать сообщение отдельно
grizlik78
Эксперт С++
1971 / 1464 / 122
Регистрация: 29.05.2011
Сообщений: 3,032
24.08.2011, 15:23
Проблема видна в этой теме: Цветные шары
В принципе, я считаю подобные задачи на "плавучку" не совсем корректными.

Добавлено через 16 часов 17 минут
Чтобы было понятно, откуда вообще может взяться проблема, можно посмотреть на вывод вот такой программы:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <iomanip>
 
using namespace std;
 
int main()
{
    for (int i = 1; i < 8; i += 2)
    {
        double v = i*875 / 8000.0;
        cout << fixed << setprecision(5) << v << endl;
        cout << fixed << setprecision(7) << v << endl << endl;
    }
    return 0;
}
Вывод:
Код
$ ./a.out      
0.10938
0.1093750

0.32812
0.3281250

0.54688
0.5468750

0.76562
0.7656250
Проблема самая обычная, неточное представление чисел. То есть число 0.3281250 на самом деле хранится как 0.3281249999... и округляется к 0.32812, хотя точное значение следовало бы округлить к 0.32813.
В общем виде решение проблемы с неточным представлением мне не известно, хотя в данном случае в качестве "объезда" можно было бы прибавлять маленькое число перед выводом, скажем 1.0e-8, или даже std::numeric_limits<double>::epsilon()
Но для общего случая просто используются целочисленные вычисления, где можно получить представление рациональной дроби с любой требуемой точностью.
0
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.