Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Точные вычисления в Bcb5

3.4K
23 июля 2004 года
mag23
35 / / 04.07.2004
Элементарные арифметическое вычисление: 10/3. На калькуляторе получится 3.333333333333
и т.д.

Пишем на C++:
float a,b;
a=10;
b=3;
float c=a/b;
Edit1->Text=c;
Результат c=3,33333325386047 (погрешность).
Можно конечно использовать ffFixed , но это не приведет к желаемому успеху если нужна высокая точность. А если переменную a взять равной 1000000000000000000, то результат получится вообще не дробный (целый). Если какой-нибудь выход из ситуации?
368
23 июля 2004 года
rostyslav
629 / / 13.07.2004
Цитата:
Originally posted by mag23
Элементарные арифметическое вычисление: 10/3. На калькуляторе получится 3.333333333333
и т.д.

Пишем на C++:
float a,b;
a=10;
b=3;
float c=a/b;
Edit1->Text=c;
Результат c=3,33333325386047 (погрешность).
Можно конечно использовать ffFixed , но это не приведет к желаемому успеху если нужна высокая точность. А если переменную a взять равной 1000000000000000000, то результат получится вообще не дробный (целый). Если какой-нибудь выход из ситуации?


Попробуй тип double или long double.

3.4K
24 июля 2004 года
mag23
35 / / 04.07.2004
Цитата:
Originally posted by rostyslav

Попробуй тип double или long double.



double и long double не катит. Нужно что нибудь другое

469
26 июля 2004 года
Sli
71 / / 20.01.2000
Цитата:
Originally posted by mag23


double и long double не катит. Нужно что нибудь другое


Могу посоветовать работу со строками. В свое время на олимпиаде задание такое было для работы с большими числами. Это конечно очень медленно, но можно использовать ускоренные алгоримы.

PS: Есть еще готовая библиотека GInt но работает она только с целыми числами.

368
26 июля 2004 года
rostyslav
629 / / 13.07.2004
Цитата:
Originally posted by mag23

double и long double не катит. Нужно что нибудь
другое


если мне память не изменяет бывшая фирма Turbo Power имеет хорошую библиотеку. и теперь она бесплатна.

1.6K
26 июля 2004 года
Kadet
101 / / 26.03.2003
Цитата:
Originally posted by mag23


double и long double не катит. Нужно что нибудь другое



Согласен с Sli, а строку в число преобразовать, думаю не проблема.
Первое, что пришло в голову, может поможет:

#include<mem.h>
#include<string.h>
#include<stdlib.h>

char* delenie(double chislitel,double znamenatel,int toch)
// chislitel-числитель
// znamenatel-знаменатель
// toch-точность(до какого знака после запятой)
// return - указатель на СТРОКУ-результат
{
char rezstr[100];
double ostatok=chislitel,krd=1;
long i,j;
memset(rezstr,0,100);
for(i=0;i<(long)toch && ostatok!=0;i++)
{
for(j=0;ostatok>znamenatel;)
{
ostatok=ostatok-znamenatel;
j++;
}
strcat(rezstr,ltoa(j,0,10));
if(i==0)strcat(rezstr,".");
ostatok=ostatok*10;
krd=krd*0.1;
}
return rezstr;
}


Пример использования:

double x=10000000,y=3;
char chislo[100];
Edit1->Text=delenie(x,y,80);

2.0K
26 июля 2004 года
Fazil6
126 / / 17.12.2003
Цитата:
Originally posted by mag23


double и long double не катит. Нужно что нибудь другое



почему float катит, а double нет?

с float точности НЕ БУДЕТ. В книгах часто предостерегают от использования типа float именно из-за очень низкой точности

2.0K
26 июля 2004 года
Fazil6
126 / / 17.12.2003
Цитата:
Originally posted by Kadet


Согласен с Sli, а строку в число преобразовать, думаю не проблема.
Первое, что пришло в голову, может поможет:

#include<mem.h>
#include<string.h>
#include<stdlib.h>

char* delenie(double chislitel,double znamenatel,int toch)
// chislitel-числитель
// znamenatel-знаменатель
// toch-точность(до какого знака после запятой)
// return - указатель на СТРОКУ-результат
{
char rezstr[100];
double ostatok=chislitel,krd=1;
long i,j;
memset(rezstr,0,100);
for(i=0;i<(long)toch && ostatok!=0;i++)
{
for(j=0;ostatok>znamenatel;)
{
ostatok=ostatok-znamenatel;
j++;
}
strcat(rezstr,ltoa(j,0,10));
if(i==0)strcat(rezstr,".");
ostatok=ostatok*10;
krd=krd*0.1;
}
return rezstr;
}


Пример использования:

double x=10000000,y=3;
char chislo[100];
Edit1->Text=delenie(x,y,80);




Круто... Толь ко вот зачем это? Какой в этом смысл?

1.6K
26 июля 2004 года
Kadet
101 / / 26.03.2003
Цитата:
Originally posted by Fazil6



Круто... Толь ко вот зачем это? Какой в этом смысл?



Я сказал, что это первое что пришло в голову.
Давай свой вариант.
С double не катит.

2.0K
26 июля 2004 года
Fazil6
126 / / 17.12.2003
Цитата:
Originally posted by Kadet


Я сказал, что это первое что пришло в голову.
Давай свой вариант.
С double не катит.



Прикольно...

 
Код:
char* delenie(double chislitel,double znamenatel,int toch)


Почему твой double катит, а мой нет?
Я повторяю, без double точности не будет!!! Твой пример доказывает ЭТО! Ты не можешь с этим не согласиться.

И именно по этому не понятна цель такой функции в плане математическрой операции.

Кстати я чего-то не понимаю: зачем объявлять int toch, и сразу приводить его к (long)toch ?
1.6K
26 июля 2004 года
Kadet
101 / / 26.03.2003
Цитата:
Originally posted by Fazil6


Прикольно...

 
Код:
char* delenie(double chislitel,double znamenatel,int toch)


Почему твой double катит, а мой нет?
Я повторяю, без double точности не будет!!! Твой пример доказывает ЭТО! Ты не можешь с этим не согласиться.

И именно по этому не понятна цель такой функции в плане математическрой операции.

Кстати я чего-то не понимаю: зачем объявлять int toch, и сразу приводить его к (long)toch ?



Если просто double/double - точность не та (проверял просто на С++), хотя конечно выше чем float/float.

2.0K
26 июля 2004 года
Fazil6
126 / / 17.12.2003
Цитата:
Originally posted by Kadet


Если просто double/double - точность не та (проверял просто на С++), хотя конечно выше чем float/float.



Ну если брать во внимание 80 знаков после запятой, то наверно есть смысл.
А как будет обстоять дело, если передать в функцию не целые числа?

1.6K
26 июля 2004 года
Kadet
101 / / 26.03.2003
Цитата:
Originally posted by Fazil6


Ну если брать во внимание 80 знаков после запятой, то наверно есть смысл.
А как будет обстоять дело, если передать в функцию не целые числа?


Здаюсь.
Не учёл, что 1. изначально не 1 а гдето порядка 1+-0,0...01 Вот и не выходит с дробными числами.
Ладно, чур не пинать.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог