Просмотр полной версии : Как считать числа точнее
BastardFromHell
20.02.2010, 03:40
На сях флоаты и даблы нехватат.
Там до 5 знаков после зпт и всё, а мне надо штук 15 хотябы, как сделать?
на руби разрядность чисел ограничиваеться лишь оперативкой и свопом т.е. фактически не чем.
а если на C то придеться самому писать класс со всеми втекающими туда операциями.
P.S. если тебе посчитать какие-то конкретные числа, то скинь мне в ПМ я на руби посчитаю
http://ru.wikipedia.org/wiki/Длинная_арифметика
пример, вычисления числа Пи http://algolist.manual.ru/maths/count_fast/pi.php
Protorus
20.02.2010, 14:08
на руби разрядность чисел ограничиваеться лишь оперативкой и свопом т.е. фактически не чем
что-то я в этом сомневаюсь, число в формате с плавающей запятой занимает в памяти компьютера 4 (число обычной точности) и 8 байтов (число двойной точности), ну или 10 байтов повышенной (родной для сопроцессора)
Или в ruby все действия делаются столбиком?
DECIMAL
http://msdn.microsoft.com/ru-ru/library/system.decimal.aspx
числа в диапазоне от 79228162514264337593543950335 до -79228162514264337593543950335
можно считать с точностью до 0,9999999999999999999999999999
DECIMAL
http://msdn.microsoft.com/ru-ru/library/system.decimal.aspx
числа в диапазоне от 79228162514264337593543950335 до -79228162514264337593543950335
можно считать с точностью до 0,9999999999999999999999999999
Это .net . Речь шла о Си.
На сях флоаты и даблы нехватат.
Там до 5 знаков после зпт и всё, а мне надо штук 15 хотябы, как сделать?
Есть специальные библиотеки для работы с большими числами. Например, NTL (http://www.shoup.net/ntl/)
На сях флоаты и даблы нехватат.
Там до 5 знаков после зпт и всё, а мне надо штук 15 хотябы, как сделать?
Почему ты решил, что double только 5 знаков после запятой?
Педставление чисел double обеспечиват относительную точность порядка 16 знаков после запятой.
_http://ru.wikipedia.org/wiki/Число_двойной_точности
Возможно, что у тебя проблемы с выводом нужного числа знаков после запятой?
#include <iostream>
int main(){
double a=1.234567890123456;
std::cout<<a<<std::endl;
std::cout.precision(15);
std::cout<<a<<std::endl;
printf("%.14f \n",a);
return 0;
}
Olegros911
20.02.2010, 16:20
Почему ты решил, что double только 5 знаков после запятой?
Педставление чисел double обеспечиват относительную точность порядка 16 знаков после запятой.
_http://ru.wikipedia.org/wiki/Число_двойной_точности
Возможно, что у тебя проблемы с выводом нужного числа знаков после запятой?
#include <iostream>
int main(){
double a=1.234567890123456;
std::cout<<a<<std::endl;
std::cout.precision(15);
std::cout<<a<<std::endl;
printf("%.14f \n",a);
return 0;
}
printf("%.14f \n",a); он прав
в паскале можно при выводе
writeln('chislo',S:4:14) ,будет выводить 14 знаков после комы
BastardFromHell
20.02.2010, 16:27
угу, да, но при подсчёте и флоат и дабл округляется. Например если вот что-то типа такого считать:
#include <iostream>
using namespace std;
int main( int argc, char *argv[])
{
double x,x1 = 0;
cout << "int to start: " << endl;
cin >> x;
//f(x) = x^2 - 3
for(int i=1; i < 101; i++)
{
x1 = x - ((x*x-3)/(2*x));
x=x1;
cout << "approximation " << i << " x = " << x1 << endl;
}
return 0;
}
что-то я в этом сомневаюсь, число в формате с плавающей запятой занимает в памяти компьютера 4 (число обычной точности) и 8 байтов (число двойной точности), ну или 10 байтов повышенной (родной для сопроцессора)
Или в ruby все действия делаются столбиком?
Про целые числа в Ruby:
Конечно, они (класс Bignum) потребляют больше памяти и выполняються несколько медленнее, тем не менее операции над очень большими целыми (тысячи знаков) реальны.
Дроби в Ruby:
Стандартная библиотека bigdecimal позволяет работать с дробями, имеющими много значащих цифр. Число храниться как массив цифр, а не преобразуеться в двоичное представление. Тем самым достижима произвольная точность, естественно, ценой замедления работы.
Цитаты из книги "Путь Ruby" Хэл Фултон, стр. 164
Protorus
20.02.2010, 19:11
Число храниться как массив цифр
Спс, сомнения развеялись, значит столбиком
BastardFromHell
21.02.2010, 04:19
используй setprecision() из iomanip
Unspecified. This function should only be used as a stream manipulator. =\
Red_EYEs
21.02.2010, 10:38
gmp (http://gmplib.org/)
с точностью до 0,9999999999999999999999999999
м, хорошая точность ;)
BastardFromHell
21.02.2010, 15:24
gmp (http://gmplib.org/)
Спасибо, полезная либа. А стандартными средствами никак?
Delimiter
21.02.2010, 15:30
ну ..... еще было решение у Forth-овцев ....
они работали с целыми числами всегда:
система была проста
допустим есть 2-ва числа
0.86 и 10.5 (они просто учитывали где находится точка)
и действия выполняли с 86 и 1050
были решения как для строк(когда все числа постоянно находились в строковом выражении, так и для числового хранения!
... это если вдрух надумаешь написать библиотеку :D
BastardFromHell
21.02.2010, 15:51
Наверное имеет место быть какая-то погрешность, как бы её посчитать?
Потому что виндовс калькулятор считает точнее - http://img534.imageshack.us/img534/5437/capturewv.jpg
Red_EYEs
27.02.2010, 01:34
Спасибо, полезная либа. А стандартными средствами никак?
собственно воспроизвести то что было в либе теми же стандартными средствами :D
Хотя бы реализовать арифметику "столбиком"
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot