Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.06.2012, 09:31   #1
qptr
Новичок
Джуниор
 
Регистрация: 29.06.2012
Сообщений: 2
По умолчанию c: некорректное значение в цикле вычислений

Перевод дробного десятичного числа в систему счисления Q. До этого был код с целой переменной и кастингом double в int, результат тот же. Теперь избавился от int вообще и написал так:

Код:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define Q 5

int main(int ac, char *av[]) {

  double x = 0.592;
  double y = 0;

  while(x != 0) {
    x = x * Q;
    y = floor(x);
    printf("x = %f, y = %f\n", x, y);
    x = x - y;
    printf("x - y = %f\n", x);
  }

return 0;
Вывод программы:


x = 2.960000, y = 2.000000
x - y = 0.960000
x = 4.800000, y = 4.000000
x - y = 0.800000
x = 4.000000, y = 3.000000 // ??????????? как так получается ?
qptr вне форума Ответить с цитированием
Старый 29.06.2012, 12:13   #2
Mandrivnyk
Software Developer
Участник клуба
 
Аватар для Mandrivnyk
 
Регистрация: 01.03.2011
Сообщений: 1,098
По умолчанию

Все дело в том, что floor() возвращает максимальное целое число, которое не больше аргумента.
Возможно, из-за погрешности работы с числами с плавающей точкой, в переменной x хранится не 4.000000, а, например, 3.99999999998. Вот и получается.
Попробуйте прибавлять при вызове функции какую-нибудь мелкую константную величину.
И, кстати... из-за той же погрешности, x вряд ли когда-нибудь будет равен 0...
Болтовня ничего не стоит. Покажите мне код. (c) Linus Torvalds
Помог ответ? -- Поставьте отзыв.
Выражения особой благодарности в рублевом эквиваленте отправлять сюда --> R269634919062
Mandrivnyk вне форума Ответить с цитированием
Старый 29.06.2012, 13:06   #3
qptr
Новичок
Джуниор
 
Регистрация: 29.06.2012
Сообщений: 2
По умолчанию

Ну и ну. Подзабыл я уже программирование за долгий перерыв, хотя догадки почему так происходит, были. Буду дома значит вкуривать в ieee floating point format.
qptr вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
программа вычислений arhangel2540 Паскаль, Turbo Pascal, PascalABC.NET 4 29.02.2012 20:06
Параметры вычислений Trimbl Microsoft Office Excel 2 18.02.2012 15:25
пропустить значение в цикле Bape}l{ka Microsoft Office Excel 5 18.07.2011 17:34
Визуализация вычислений Kolobrod Помощь студентам 1 09.05.2011 16:21
Точность вычислений aly-lucenko Фриланс 1 02.05.2011 21:38