222 / 57 / 18
Регистрация: 13.03.2017
Сообщений: 295
|
||||||
1 | ||||||
Как преобразовать числа типа Decimal к Real?10.04.2017, 14:42. Показов 4124. Ответов 10
Метки нет (Все метки)
В некоторых случаях, например в астрономических расчетах, чтобы не потерять точность
арифметические операции можно делать с числами типа decimal. А обработку результатов лучше проводить используя стандартные подпрограммы с real. Как преобразовать? Простой пример, когда разность двух близких чисел в real дает ошибку.
0
|
10.04.2017, 14:42 | |
Ответы с готовыми решениями:
10
Ошибка: Нельзя преобразовать тип function x real real к real Нельзя преобразовать тип function(x: real): real к real Нельзя преобразовать тип function(x real) real к real Нельзя преобразовать тип function(x: real): real к real |
1755 / 1347 / 1407
Регистрация: 28.10.2016
Сообщений: 4,267
|
||||||
10.04.2017, 15:11 | 2 | |||||
Сообщение было отмечено Сергей Игнатьев как решение
Решение
Как вариант
1
|
222 / 57 / 18
Регистрация: 13.03.2017
Сообщений: 295
|
|
10.04.2017, 16:08 [ТС] | 3 |
Все ОК, спасибо !
0
|
Почетный модератор
64300 / 47595 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
|
||||||
10.04.2017, 16:19 | 4 | |||||
Сообщение было отмечено Сергей Игнатьев как решение
Решение
1
|
222 / 57 / 18
Регистрация: 13.03.2017
Сообщений: 295
|
|
10.04.2017, 17:19 [ТС] | 5 |
Спасибо. Отлично все работает, но любопытно еще другое: почему при заполнении всех разрядов тройками
1/3 у Decimal заполняются только 15 разрядов ? 0.333333333333334 0.333333333333338 -3.99680288865056E-15 0.333333333333333000001 ?? 0.333333333333333000005 ?? -0.000000000000000000004 -4E-21 Добавлено через 38 минут Нашел ответ: нужно константы тоже объявлять как decimal var t:decimal:=3; c:=1/t; Спасибо всем !
0
|
20 / 67 / 18
Регистрация: 12.04.2017
Сообщений: 260
|
||||||
12.04.2017, 15:44 | 6 | |||||
Есть еще такой вариант (пример)
1
|
222 / 57 / 18
Регистрация: 13.03.2017
Сообщений: 295
|
|
14.04.2017, 06:26 [ТС] | 7 |
Alvico, Спасибо. обязательно попробую.
Добавлено через 23 часа 50 минут Если кому-то интересно повысить точность расчетов, результаты экспериментов следующие: 1. Расчет системы линейных уравнений n=1000 c переменными типа real время расчета 13.5 сек, максимальная погрешность х ~60 *10-12 2.Расчет системы линейных уравнений n=1000 c переменными типа decimal время расчета 195.3 сек, максимальная погрешность х ~44 *10-24 Вывод: время увеличивается примерно в 15 раз, точность на 12 порядков выше !
0
|
20 / 67 / 18
Регистрация: 12.04.2017
Сообщений: 260
|
|
14.04.2017, 10:46 | 8 |
Можно чуть напрячься и написать свой класс BigFloat для набора арифметических (и прочих по необходимости операций) над числами с произвольной разрядностью в форме с плавающей точкой. В качестве нормализованной мантиссы взять BigInteger, в качестве порядка будет достаточно integer. Арифметические операции перегрузить - и вот оно, счастье!
Добавлено через 2 минуты Как вариант - отказаться от плавающей точки и работать с простыми дробыми, храня числитель и знаменатель в виде кортежа или записи BigInteger. Точность станет абсолютной.
1
|
222 / 57 / 18
Регистрация: 13.03.2017
Сообщений: 295
|
|
14.04.2017, 12:25 [ТС] | 9 |
Alvico, Спасибо, если Вы это реализуете. я смогу решать свои астрономические задачи без проблем.
Потому как совершенно несовместимые расстояния, да еще в квадрате, не позволяют учитывать влияние гравитации от темной материи. Добавлено через 6 минут Кстати, когда я рассчитывал большие системы уравнений с переменными типа decimal, то совершенно не беспокоился, что это числа с фиксированной точкой. Все и так получилось прекрасно.
0
|
20 / 67 / 18
Регистрация: 12.04.2017
Сообщений: 260
|
|
14.04.2017, 12:37 | 10 |
Сформулируйте отдельным вопросом, что Вы хотите - класс для работы с плавающей точкой при задании ограничения на количество знаков (поскольку нельзя 1/3 представить бесконечно точно) или для работы с простыми дробями в произвольной разрядности. Опишите набор желаемых операций. И сообщество Вам поможет решить проблему.
А еще, быть может, Вам просто использовать систему компьютерной алгебры, например Maple?
1
|
222 / 57 / 18
Регистрация: 13.03.2017
Сообщений: 295
|
|
14.04.2017, 12:50 [ТС] | 11 |
Спасибо, я и так доволен, что удалось повысить точность на 10-12 порядков с помощью decimal. Для моих ближайших задач больше пока не требуется.
0
|
14.04.2017, 12:50 | |
14.04.2017, 12:50 | |
Помогаю со студенческими работами здесь
11
Нельзя преобразовать тип function(x: real): real к real извлечь квадратный корень из числа типа decimal Чтение файла с данными типа real. Тип real в билдере или как его "обойти"? Program1.pas(7) : Нельзя преобразовать тип KeyValuePair<real,integer> к real Нельзя преобразовать тип array [1..100] of real к real Как преобразовать Double в Decimal? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |