Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> сравнение огромных десятичных дробей, сравнение дробей 
V
    Опции темы
valerchi
Дата 15.2.2014, 04:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 163
Регистрация: 27.5.2008
Где: Геническ

Репутация: нет
Всего: нет



Искал по инету как сравнить огромные десятичные дробные числа. Готовых функций нет, поэтому написал свою. Сильно не ругайте. Работа "топорная", не сравнивает отрицательные числа, но за не имением лучшего, может кому-то подойдёт
Код

procedure Sravn(as1, as2: String);   //сравнение дробей
var sr1,sr2:string; metka1,metka2,metka3,metka4,drob1,drob2,dlina,dlina1,dlina2,cel1,cel2,schot:integer;
begin
sr1:=as1;
sr2:=as2;
resultat:=-1;
dlina:=0;
dlina1:=length(sr1);   //вычисляем наибольшую длину строк
dlina2:=length(sr2);
if dlina1>dlina2 then
dlina:=dlina1;
if dlina2>=dlina1 then
dlina:=dlina2;
//вычисляем сколько целых чисел и сколько дробных чисел в каждом числе
schot:=0;
metka1:=0;
metka2:=0;
metka3:=0;
metka4:=0;
cel1:=-1;
cel2:=-1;
repeat
inc(schot);
//первое число вычисляем сколько целых чисел
if ((sr1[schot]=',')or(sr1[schot]=''))and(metka1=0) then
begin
if (sr1[schot]=',')then
metka3:=1;
metka1:=1;
cel1:=schot-1;
end;
//второе число вычисляем сколько целых чисел
if ((sr2[schot]=',')or(sr2[schot]=''))and(metka2=0) then
begin
if (sr2[schot]=',')then
metka4:=1;
metka2:=1;
cel2:=schot-1;     //первое число вычисляем сколько целых чисел
end;
until dlina=schot;
//если не дошли до запятой и незнаем ск-ко целых чисел то
if cel1=-1 then
cel1:=schot; //первое число вычисляем сколько целых чисел
if cel2=-1 then
cel2:=schot; //второе число вычисляем сколько целых чисел
//вычисляем ск-ко дробных чисел (дробь = длина - целое)
if metka3=1 then
drob1:=dlina1-cel1-1   // если была запятая
else
drob1:=dlina1-cel1;
if metka4=1 then
drob2:=dlina2-cel2-1   // если была запятая
else
drob2:=dlina2-cel2;
//начинаем сравнение
if cel1>cel2 then
resultat:=1;
if cel2>cel1 then
resultat:=2;
if cel1=cel2 then
begin
//если одно число целое, а другое дробное, и целые равны то до целого
//дописываем запятую и ставим на оставшуюся длину нули
if drob1>drob2 then
begin
if sr2[1]<>'0' then
begin
sr2:=sr2+',';
schot:=0;
end
else
schot:=0;
repeat
inc(schot);
sr2:=sr2+'0';
until schot=drob1;
end;
if drob2>drob1 then
begin
if sr1[1]<>'0' then
begin
sr1:=sr1+',';
schot:=0;
end
else
schot:=0;
repeat
inc(schot);
sr1:=sr1+'0';
until schot=drob2;
end;
schot:=0;
repeat
inc(schot);
if ((sr1[schot])>(sr2[schot]))and(((sr1[schot]<>',')and(sr2[schot]<>',')))then
begin
resultat:=1;
break;
end;
if ((sr1[schot])<(sr2[schot]))and(((sr1[schot]<>',')and(sr2[schot]<>',')))then
begin
resultat:=2;
break;
end;
until schot=dlina;
if resultat=-1 then
resultat:=0;
end;
end;

PM MAIL   Вверх
valerchi
Дата 15.2.2014, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 163
Регистрация: 27.5.2008
Где: Геническ

Репутация: нет
Всего: нет



Забыл добавить, что в процедуру вводятся переменные типа string, а результат выдаётся в виде переменной типа integer. Если результат (переменная resultat) равен 1, то число слева больше чем число справа, если переменная resultat равна 2, то число справа больше чем число слева, если переменная resultat равна 0, то числа одинаковы.
PM MAIL   Вверх
valerchi
Дата 15.2.2014, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 163
Регистрация: 27.5.2008
Где: Геническ

Репутация: нет
Всего: нет



Вот доделал полностью. Сравнивает все дробные числа и положительные и отрицательные
Код

procedure Sravn(as1, as2: String);   //сравнение дробей
var sr1,sr2:string; metka1,metka2,metka3,metka4,drob1,drob2,dlina,dlina1,dlina2,cel1,cel2,schot:integer;
begin
sr1:=as1;
sr2:=as2;
if ((sr1[1]='-')and(sr2[1]='-'))or((sr1[1]<>'-')and(sr2[1]<>'-')) then
begin
resultat:=-1;
dlina:=0;
dlina1:=length(sr1);   //вычисляем наибольшую длину строк
dlina2:=length(sr2);
if dlina1>dlina2 then
dlina:=dlina1;
if dlina2>=dlina1 then
dlina:=dlina2;
//вычисляем сколько целых чисел и сколько дробных чисел в каждом числе
schot:=0;
metka1:=0;
metka2:=0;
metka3:=0;
metka4:=0;
cel1:=-1;
cel2:=-1;
repeat
inc(schot);
//первое число вычисляем сколько целых чисел
if ((sr1[schot]=',')or(sr1[schot]=''))and(metka1=0) then
begin
if (sr1[schot]=',')then
metka3:=1;
metka1:=1;
cel1:=schot-1;
end;
//второе число вычисляем сколько целых чисел
if ((sr2[schot]=',')or(sr2[schot]=''))and(metka2=0) then
begin
if (sr2[schot]=',')then
metka4:=1;
metka2:=1;
cel2:=schot-1;     //первое число вычисляем сколько целых чисел
end;
until dlina=schot;
//если не дошли до запятой и незнаем ск-ко целых чисел то
if cel1=-1 then
cel1:=schot; //первое число вычисляем сколько целых чисел
if cel2=-1 then
cel2:=schot; //второе число вычисляем сколько целых чисел
//вычисляем ск-ко дробных чисел (дробь = длина - целое)
if metka3=1 then
drob1:=dlina1-cel1-1   // если была запятая
else
drob1:=dlina1-cel1;
if metka4=1 then
drob2:=dlina2-cel2-1   // если была запятая
else
drob2:=dlina2-cel2;
//начинаем сравнение
if cel1>cel2 then
resultat:=1;
if cel2>cel1 then
resultat:=2;
if cel1=cel2 then
begin
//если одно число целое, а другое дробное, и целые равны то до целого
//дописываем запятую и ставим на оставшуюся длину нули
if drob1>drob2 then
begin
if sr2[1]<>'0' then
begin
sr2:=sr2+',';
schot:=0;
end
else
schot:=0;
repeat
inc(schot);
sr2:=sr2+'0';
until schot=drob1;
end;
if drob2>drob1 then
begin
if sr1[1]<>'0' then
begin
sr1:=sr1+',';
schot:=0;
end
else
schot:=0;
repeat
inc(schot);
sr1:=sr1+'0';
until schot=drob2;
end;
schot:=0;
repeat
inc(schot);
if ((sr1[schot])>(sr2[schot]))and(((sr1[schot]<>',')and(sr2[schot]<>',')))then
begin
resultat:=1;
if sr1[1]='-'then
resultat:=2;
break;
end;
if ((sr1[schot])<(sr2[schot]))and(((sr1[schot]<>',')and(sr2[schot]<>',')))then
begin
resultat:=2;
if sr1[1]='-'then
resultat:=1;
break;
end;
until schot=dlina;
if resultat=-1 then
resultat:=0;
end;
exit;
end;
if (sr1[1]='-')or(sr2[1]='-') then
begin
if sr1[1]='-' then
resultat:=2;
if sr2[1]='-' then
resultat:=1;
end;
end;


Это сообщение отредактировал(а) valerchi - 16.2.2014, 17:21
PM MAIL   Вверх
Poseidon
Дата 15.2.2014, 19:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 9
Всего: 133



Просто оставлю это здесь
http://forum.vingrad.ru/index.php?showtopi...t&p=2249738


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
valerchi
Дата 16.2.2014, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 163
Регистрация: 27.5.2008
Где: Геническ

Репутация: нет
Всего: нет



Цитата(Poseidon @ 15.2.2014,  19:48)
Просто оставлю это здесь
http://forum.vingrad.ru/index.php?showtopi...t&p=2249738

(Это модуль для работы с очень большими числами без потери точности. Модуль даёт возможность манипулирования с 10000 и более значащими цифрами в числах. В модуле реализованы сложение, вычитание, умножение, деление, возведение в целую степень и факториал. Все функции в качестве аргументов принимают длинные строки и результат выдают тоже в виде строки.)

Вроде бы тут ничего не написано про сравнение. Может я что-то не так понял?
PM MAIL   Вверх
Poseidon
Дата 16.2.2014, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 9
Всего: 133



Любое сравнение можно привести к вычитанию, результат которого будет либо больше 0, либо менше 0, либо равен 0. Я думаю не составит труда сделать функцию сравнения на основе функции вычитания. 


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
valerchi
Дата 17.2.2014, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 163
Регистрация: 27.5.2008
Где: Геническ

Репутация: нет
Всего: нет



Дело в том, что я пробовал вычитать числа 0.00000000002-0.00000000001, функция не сработала. Может я что-то не так делаю
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0466 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.