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

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

Войти
Регистрация
Восстановить пароль
 
Ilyaa
20 / 20 / 3
Регистрация: 29.04.2012
Сообщений: 214
#1

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

21.02.2013, 21:39. Просмотров 571. Ответов 4
Метки нет (Все метки)

Сначала опишу задание, потом проблему.
Задание:
Дан первый элемент, остальную часть последовательности чисел надо вычислить по определенной формуле.
первый элемент, 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, прошу воздержаться.
0
Миниатюры
Погрешность дробной части  
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.02.2013, 21:39
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Погрешность дробной части (C++):

Определить равна ли сумма k цифр дробной части заданного вещественного числа сумме цифр целой части - C++
Помогите доделать задание, исправьте пожалуйста код!!! Срочно! Задание: Выполнить задания, выделяя цифры числа, хранящегося в переменной...

Определения, равна сумма цифр целой части вещественного числа сумме такого же количества цифр в дробной части - C++
Нада написать 2 программки 1. Определения, равна сумма цифр целой части вещественного числа сумме такого же количества цифр в дробной...

Вывести старшую цифру дробной части и младшую цифру целой части числа - C++
Искал у вас, не нашел. Я новичок в этом деле, если вам не трудно напишите полностью решение ща контрольная ( 31. Даны натуральные...

Вывод дробной части - C++
Всем привет. Проблема собственно такая, не получается вывести дробную часть стороны треугольника, т.е 4,5(выводит только 4) уже не выводит,...

Округление дробной части - C++
Помогите пожалуйста!!! Как реализовать метод округления дробной части до 0,1 (0,36 -&gt; 0,4; 0, 33333 -&gt;0,3 и т.д.)????

Отброс дробной части - C++
как можно отбросить дробную часть(не округлить) от переменной?

4
palva
2690 / 1917 / 288
Регистрация: 08.06.2007
Сообщений: 7,055
Записей в блоге: 4
21.02.2013, 23:11 #2
Цитата Сообщение от Ilyaa Посмотреть сообщение
ВОпрос: как мне обнулить все, что после тысячных?
Это невозможно сделать, оставаясь в рамках двоичной системы и типа double. Такое число в любом случае будет представлено с погрешностью.

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

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

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

А частоты буду именно так считать. Спасибо)
0
21.02.2013, 23:59
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.02.2013, 23:59
Привет! Вот еще темы с ответами:

Рассмотрение дробной части чисел - C++
Здравствуйте! :) Подскажите, пожалуйста, с решение одной задачки. Сама задача:Дана строка. Если строка содержит целое число – вывести 0,...

Вывод дробной и целой части - C++
Вывод дробной и целой части. Вводим число с = 1,5 ; Выводит целое: а = ; и дробное: в = ;

Отделение дробной части от числа - C++
у меня такое задание: Функци принимает в себя дробное число и возвращает только его дробную часть мне нужно вывести на экран только...

Вывод целой и дробной части - C++
&quot;Вводятся числитель и знаменатель дроби. Вывести: знак, целую часть, сокращенные числитель и знаменатель.&quot; со знаком разобрался,а вот...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

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