Точные вычисления в Bcb5
и т.д.
Пишем на C++:
float a,b;
a=10;
b=3;
float c=a/b;
Edit1->Text=c;
Результат c=3,33333325386047 (погрешность).
Можно конечно использовать ffFixed , но это не приведет к желаемому успеху если нужна высокая точность. А если переменную a взять равной 1000000000000000000, то результат получится вообще не дробный (целый). Если какой-нибудь выход из ситуации?
Элементарные арифметическое вычисление: 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.
Попробуй тип double или long double.
double и long double не катит. Нужно что нибудь другое
double и long double не катит. Нужно что нибудь другое
Могу посоветовать работу со строками. В свое время на олимпиаде задание такое было для работы с большими числами. Это конечно очень медленно, но можно использовать ускоренные алгоримы.
PS: Есть еще готовая библиотека GInt но работает она только с целыми числами.
double и long double не катит. Нужно что нибудь
другое
если мне память не изменяет бывшая фирма Turbo Power имеет хорошую библиотеку. и теперь она бесплатна.
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);
double и long double не катит. Нужно что нибудь другое
почему float катит, а double нет?
с float точности НЕ БУДЕТ. В книгах часто предостерегают от использования типа float именно из-за очень низкой точности
Согласен с 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);
Круто... Толь ко вот зачем это? Какой в этом смысл?
Круто... Толь ко вот зачем это? Какой в этом смысл?
Я сказал, что это первое что пришло в голову.
Давай свой вариант.
С double не катит.
Я сказал, что это первое что пришло в голову.
Давай свой вариант.
С double не катит.
Прикольно...
Почему твой double катит, а мой нет?
Я повторяю, без double точности не будет!!! Твой пример доказывает ЭТО! Ты не можешь с этим не согласиться.
И именно по этому не понятна цель такой функции в плане математическрой операции.
Кстати я чего-то не понимаю: зачем объявлять int toch, и сразу приводить его к (long)toch ?
Прикольно...
Почему твой double катит, а мой нет?
Я повторяю, без double точности не будет!!! Твой пример доказывает ЭТО! Ты не можешь с этим не согласиться.
И именно по этому не понятна цель такой функции в плане математическрой операции.
Кстати я чего-то не понимаю: зачем объявлять int toch, и сразу приводить его к (long)toch ?
Если просто double/double - точность не та (проверял просто на С++), хотя конечно выше чем float/float.
Если просто double/double - точность не та (проверял просто на С++), хотя конечно выше чем float/float.
Ну если брать во внимание 80 знаков после запятой, то наверно есть смысл.
А как будет обстоять дело, если передать в функцию не целые числа?
Ну если брать во внимание 80 знаков после запятой, то наверно есть смысл.
А как будет обстоять дело, если передать в функцию не целые числа?
Здаюсь.
Не учёл, что 1. изначально не 1 а гдето порядка 1+-0,0...01 Вот и не выходит с дробными числами.
Ладно, чур не пинать.