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

Погрешность дробной части - C++

Восстановить пароль Регистрация
 
Ilyaa
20 / 20 / 3
Регистрация: 29.04.2012
Сообщений: 213
21.02.2013, 21:39     Погрешность дробной части #1
Сначала опишу задание, потом проблему.
Задание:
Дан первый элемент, остальную часть последовательности чисел надо вычислить по определенной формуле.
первый элемент, z=0.067

Проблема:
НО при отладке я заметил, что число выходит не совсем такое, как мне надо. Лишняя цифра на конце. Отсюда появляется погрешность, которая растет с ростом кол-ва вычислений.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <cmath>
 
#define K 11
#define z 0.067 //this is x0
#define P 3.141
 
void K_way(double *table)
{
 
    double assist=0, integral=0;
    table[0]=z;
    for(int i=1; i<1000; i++)
    {
        assist=K*table[i-1];
        table[i]=modf(assist, &integral);
    }
}
ВОпрос: как мне обнулить все, что после тысячных?
Я не нашел таких функций в библиотеке <cmath>

И еще кое-что: мне надо, чтобы они уже в массиве были ровные, аккуратные числа вида 0,***00000000000000000000000, т.к. потом будет сортировка и подсчет частоты.
То есть тех, кто хочет посоветовать setprecision(3) для output'a, прошу воздержаться.
Миниатюры
Погрешность дробной части  
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
palva
 Аватар для palva
2373 / 1595 / 190
Регистрация: 08.06.2007
Сообщений: 6,364
Записей в блоге: 4
21.02.2013, 23:11     Погрешность дробной части #2
Цитата Сообщение от Ilyaa Посмотреть сообщение
ВОпрос: как мне обнулить все, что после тысячных?
Это невозможно сделать, оставаясь в рамках двоичной системы и типа double. Такое число в любом случае будет представлено с погрешностью.

Добавлено через 30 минут
Может быть, если представить все числа величинами в тысячу раз большими их реальных значений, вас устроит целая арифметика? Саму формулу вы не привели, но если она сводится к умножению на 11, то должно получиться.
Ilyaa
20 / 20 / 3
Регистрация: 29.04.2012
Сообщений: 213
21.02.2013, 23:43  [ТС]     Погрешность дробной части #3
Цитата Сообщение от palva Посмотреть сообщение
Саму формулу вы не привели, но если она сводится к умножению на 11, то должно получиться.
Не, формула роли не играет. Она простая и действительно сводится к умножению.

Цитата Сообщение от palva Посмотреть сообщение
Может быть, если представить все числа величинами в тысячу раз большими их реальных значений, вас устроит целая арифметика?
Я пробовал умножать числа на 1000, переводить в int, потом обратно в double и делить на 1к. Погрешность возвращалась.

Хотя можно попробовать вариант следующий: умножить на 1000 перевести всю таблицу в int. потом отсортировать, посчитать частоту. После этого перевести обратно в дабл и /1000.
Это извращение какое-то выходит правда...
Да и результата не будет хорошего. Скорее всего значения сохранятся.
palva
 Аватар для palva
2373 / 1595 / 190
Регистрация: 08.06.2007
Сообщений: 6,364
Записей в блоге: 4
21.02.2013, 23:46     Погрешность дробной части #4
Цитата Сообщение от Ilyaa Посмотреть сообщение
потом обратно в double и делить на 1к. Погрешность возвращалась.
Естественно. Число не может быть представлено без погрешности.
Если вам нужно вывести такое число, то нужно перевести целое число в строку и программным образом вставить в строку точку (запятую). А если считать частоты, то считайте по целым числам.
Ilyaa
20 / 20 / 3
Регистрация: 29.04.2012
Сообщений: 213
21.02.2013, 23:59  [ТС]     Погрешность дробной части #5
Цитата Сообщение от palva Посмотреть сообщение
Если вам нужно вывести такое число, то нужно перевести целое число в строку и программным образом вставить в строку точку (запятую). А если считать частоты, то считайте по целым числам.
О, найн, зачем так мучиться? Можно же просто указать %1.3f при выводе в консоль или записи в файл.

А частоты буду именно так считать. Спасибо)
Yandex
Объявления
21.02.2013, 23:59     Погрешность дробной части
Ответ Создать тему
Опции темы

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