Форум программистов, компьютерный форум, киберфорум
PascalABC.NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.76/21: Рейтинг темы: голосов - 21, средняя оценка - 4.76
222 / 57 / 18
Регистрация: 13.03.2017
Сообщений: 295
1

Как преобразовать числа типа Decimal к Real?

10.04.2017, 14:42. Показов 4124. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
В некоторых случаях, например в астрономических расчетах, чтобы не потерять точность
арифметические операции можно делать с числами типа decimal. А обработку результатов лучше
проводить используя стандартные подпрограммы с real. Как преобразовать?
Простой пример, когда разность двух близких чисел в real дает ошибку.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
var 
c,d:decimal;
a,b,ra:real;
Begin
 
a:=1.0/3.0;
b:=a;
a:=a+0.000000000000001;
b:=b+0.000000000000005;
writeln(a);
writeln(b);
writeln(a-b);
 
c:=1.0/3.0;
d:=c;
c:=c+0.000000000000000000001;
d:=d+0.000000000000000000005;
writeln(c);
writeln(d);
writeln(c-d);
//a:=d;  //Как преобразовать?
end.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.04.2017, 14:42
Ответы с готовыми решениями:

Ошибка: Нельзя преобразовать тип function x real real к real
Здравствуйте, не могу понять как исправить ошибку (строка 32) var a,b,e,h,xi,fi,ln1,ln2:real;...

Нельзя преобразовать тип function(x: real): real к real
Ничего не понимаю, почему нельзя? Помогите пожалуйста найти ошибку в коде. uses CRT; type ...

Нельзя преобразовать тип function(x real) real к real
program Simpson; var x,a,b,h,s:real; n:integer; function Y(t:real):real; begin...

Нельзя преобразовать тип function(x: real): real к real
Здравствуйте! Не могу написать формулу. Ошибка:Нельзя преобразовать тип function(x: real): real к...

10
1755 / 1347 / 1407
Регистрация: 28.10.2016
Сообщений: 4,267
10.04.2017, 15:11 2
Лучший ответ Сообщение было отмечено Сергей Игнатьев как решение

Решение

Как вариант
Pascal
21
a:=d.ToString.Replace(',','.').ToReal;
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
Лучший ответ Сообщение было отмечено Сергей Игнатьев как решение

Решение

Цитата Сообщение от Сергей Игнатьев Посмотреть сообщение
Как преобразовать числа типа Decimal к Real ?
Pascal
1
2
3
4
5
6
7
8
var a:decimal;
    b:real;
begin
a:=pi/100000;
writeln(a);
b:=real(a);
writeln(b);
end.
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
Есть еще такой вариант (пример)
Pascal
1
2
var d:=decimal.zero+sqrt(3);
var c:=decimal.one/3;
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.04.2017, 12:50
Помогаю со студенческими работами здесь

Нельзя преобразовать тип function(x: real): real к real
var g,s,s1,s2,fi,h:real; label k; begin write('Vvedite visotu'); readln(h);k: write('Vvedite...

извлечь квадратный корень из числа типа decimal
Возникла необходимость работать с типом decimal. Но sqrt вот с ним не работает. Не подскажете, как...

Чтение файла с данными типа real. Тип real в билдере или как его "обойти"?
Читаю файл в структуру, double Fdat; struct STR { ... } rec

Program1.pas(7) : Нельзя преобразовать тип KeyValuePair<real,integer> к real
program pomogite; var x, y: real; begin readln(x); if x=&gt;-2 and 3&gt;=x then y:=sqrt(x*x+4) ...

Нельзя преобразовать тип array [1..100] of real к real
Помогите в чем здесь ошибка. Выводить ошибку: Program4.pas(10) : Нельзя преобразовать тип array ...

Как преобразовать Double в Decimal?
Все очень просто Convert.ToDouble(value)


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru