long double и floating point error

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
ilyagoo
Сообщения: 3
Зарегистрирован: 22 окт 2007, 17:11

22 окт 2007, 17:24

доброго времени суток, господа. прощу помочь вот в каком вопросе:
реализую Метод Наименьших Квадратов на си. это работа с матрицами, элементами которых являются рациональные числа. обрабатывается большое количество чисел (порядка пары тысяч). при использовании функции pow() возникает floating point error. т.к. числа рациональные, а я имею дело с их произведениями, то получаю числа близкие к 0. почему-то не пашет long double, хотя и его я думаю не очень-то хватит. как бы вывернуться из этой западни? пишу под вынь, юзаю borland c 5.5 (консоль). в итоге это всё будет перекинуто в builder 6, но надо для начала избавиться от этих ошибок. пожалуйста, если знаете пути решения, выручайте.
заранее спасибо всем ответившим.
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

23 ноя 2007, 11:47

Думаю, здесь мы просто упираемся в особенности машиного предстваления чисел и что ли сделать с этим не получится простыми методами. Если long double не поможет, то придётся изобретать что-то более сложное. Например свой тип. Могу предложить подход когда число будет снабжено дополнительной long long пременной, которая будет хранить масштаб мантисы. Программа должна анализировать значение числа, и если оно слишком близко к нулю, то умножать его 10 в n-й степени, а в переменную long long помещать число n. Это набросок, попрошу не придираться к мелочам :)

Подобный подход наверняка спасёт. Проблема в том, что нужно будет реализовать операции + - * / с такими числами. Ну и не стоит говорить, думаю, о том, что максимально удобно это было бы реализовать с помощью класса.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Ответить