Расчеты с точностью до n знаков после запятой (n>15)

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Rody66
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 183
Зарегистрирован: 16.01.2011 (Вс) 17:03

Расчеты с точностью до n знаков после запятой (n>15)

Сообщение Rody66 » 23.12.2011 (Пт) 5:44

Заинтересовался точным до n-ого кол-ва знаков после запятой калькулятором, но открыл для себя, что никаких идей у меня этот насчет, нет.
Я уверен, что далеко не первый, кто задавался этим вопросом. Например, я знаю что еще в девяностых число pi высчитывали с точностью до нескольких миллионов знаков после запятой, я уже не говорю про наши времена.
Как я понял, в vb6 у типа Double максимальная точность - это 15 знаков после запятой. А вот уже в Delphi 7 точность расчетов до 20 знаков. По поиску бегло прошелся, толкового ничего не нашел.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Расчеты с точностью до n знаков после запятой (n>15)

Сообщение alibek » 23.12.2011 (Пт) 9:31

Rody66 писал(а):Как я понял, в vb6 у типа Double максимальная точность - это 15 знаков после запятой. А вот уже в Delphi 7 точность расчетов до 20 знаков. По поиску бегло прошелся, толкового ничего не нашел.

Ерунда.
Для float-чисел нет такой характеристики, как число знаков после запятой.
Если количество значащих разрядов. А оно для Double одинаково во всех языках, хоть в VB, хоть в Delphi.

Для расчетов с высокой точностью используются дополнительные модули или классы. Можно поискать на форуме (помоему Viper выкладывал), можно написать самому — если не брать тригонометрию, там ничего сложного.
Lasciate ogni speranza, voi ch'entrate.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 23.12.2011 (Пт) 11:59

Кажется, в Делфи есть аналог Си++'овского long double (10 байт), который точнее double (8 байт) и имеет больший диапазон.

Sam777e
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 157
Зарегистрирован: 16.09.2010 (Чт) 4:33

Re: Расчеты с точностью до n знаков после запятой (n>15)

Сообщение Sam777e » 23.12.2011 (Пт) 14:40

Help по Currency дает две строки: VB и VBA. И вот что можно получить, стартуя со второй.

Data Type Summary

Currency (scaled integer) 8 bytes
-922,337,203,685,477.5808 to 922,337,203,685,477.5807

Decimal 14 bytes
+/-79,228,162,514,264,337,593,543,950,335 with no decimal point;
+/-7.9228162514264337593543950335 with 28 places to the right
of the decimal;
smallest non-zero number is +/-0.0000000000000000000000000001


Одна тонкость - нельзя просто объявлять переменную как Currency / Decimal; надо объявлять как Variant, а затем использовать:

Note At this time the Decimal data type can only be used within aVariant, that is, you cannot declare a variable to be of type Decimal. You can, however, create a Variant whose subtype is Decimal using the CDec function.


Я работал с этим вполне успешно.

Ну, и, конечно, чудес на свете не бывает - для большой точности все используют длинную [ == строковую ] арифметику.

Вот модуль [ не мой: http://www.vbnet.ru/articles/showarticle.aspx?id=92 , возможно с моими правками / добавлениями ], там не все верно с отрицательными числами - но сие поправляемо.
Вложения
LongNumbers-UTF-8.RAR
(4.72 Кб) Скачиваний: 63
Здоровья и удачи

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Расчеты с точностью до n знаков после запятой (n>15)

Сообщение alibek » 23.12.2011 (Пт) 20:53

Sam777e писал(а):Ну, и, конечно, чудес на свете не бывает - для большой точности все используют длинную [ == строковую ] арифметику.

Кошмар.
Кто эти "все"?
Для произвольной точности используют не строки, а байтовые массивы или байтовые структуры.
Lasciate ogni speranza, voi ch'entrate.

Sam777e
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 157
Зарегистрирован: 16.09.2010 (Чт) 4:33

Re: Расчеты с точностью до n знаков после запятой (n>15)

Сообщение Sam777e » 23.12.2011 (Пт) 22:29

2 alibek
Верно, спасибо.
Маленький треп / флейм.

1. Наверное, естественная реакция - несколько обидно; ну, в реплике ~эмоции [ "Кошмар", а можно ведь просто - "Неверно" ] и я позволил себе... Однако, я очень хорошо понимаю, что здесь ничего персонального, а указано на ошибку для правильной ориентации "общества".

2. Этимология ошибки.
Я - скорее пожилой, чем юный. Начинал на эвм с 37-ми битовым словом; ВСЁ, что знаю в программировании, освоил самостоятельно - уровень соответствующий. И с тех давних времен [ ASCII ] практически считаю синонимами байт и символ; хотя, если на секунду задуматься об эффективности, то сразу всё понятно . . .
Кроме того [ и слегка - снова возраст. . . :--( ], чрезвычайно трудно правильно сформулировать мысль - особенно, когда мыслишь не "ясно"; а следовало сказать "можно, хотя это и не лучший подход, использовать строки".

3. Ну, и никто ничего не сказал про Decimal - а там все-таки 28-29 > 15 знаков; может топик-стартеру хватило бы. А кстати, я давно хотел дать ссылку на эту длинную строковую арифметику - просто руки не доходили; а потом обнаружил там неточности с отрицательными числами... Однако, МОЖЕТ БЫТЬ, некоторым будет более ясна работа именно не с байтами . . .

С уважением
Здоровья и удачи

Rody66
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 183
Зарегистрирован: 16.01.2011 (Вс) 17:03

Re: Расчеты с точностью до n знаков после запятой (n>15)

Сообщение Rody66 » 23.12.2011 (Пт) 23:28

Если количество значащих разрядов. А оно для Double одинаково во всех языках, хоть в VB, хоть в Delphi.

Может я что-то не так делал, но в бейсике максимальное кол-во знаков после запятой у типа Double, я добился 15. Судя по линку, в делфи это чило 20.
Кажется, в Делфи есть аналог Си++'овского long double (10 байт), который точнее double (8 байт) и имеет больший диапазон.

Это верно, и называется он Extended, причем он тоже имеет максимум 20 знаков после запятой.
Для произвольной точности используют не строки, а байтовые массивы или байтовые структуры.

Может литература какая на эту тему имеется?
alibek писал(а):Ерунда.

alibek писал(а):Кошмар.

1. Наверное, естественная реакция - несколько обидно; ну, в реплике ~эмоции [ "Кошмар", а можно ведь просто - "Неверно" ] и я позволил себе... Однако, я очень хорошо понимаю, что здесь ничего персонального, а указано на ошибку для правильной ориентации "общества".

Да, Г-н alibek последнее время, похоже, не в настроении.
3. Ну, и никто ничего не сказал про Decimal - а там все-таки 28-29 > 15 знаков; может топик-стартеру хватило бы.

Большое спасибо, это и правда продвижение вперед. Но все-таки, на самом деле хотелось бы узнать способы вычислять до любой произвольной точности (например, до 1000 знаков)
И за пример Ваш спасибо, посмотрю.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Расчеты с точностью до n знаков после запятой (n>15)

Сообщение Хакер » 24.12.2011 (Сб) 0:19

Rody66 писал(а): Но все-таки, на самом деле хотелось бы узнать способы вычислять до любой произвольной точности (например, до 1000 знаков)

Заведи сколькотебенужно-битное FP-число и оперируй ими. Максимальная разрядность FP-чисел, оперировать которым можно средствами процессора: 128 бит. И то, если процессор поддерживает SSE.

Если процессор не поддеживает SSE, или если нужно оперировать числами большей разрядности, тебе вместо аппаратной реализации операций нужна программная. Либо готовая, либо ты пишешь её с нуля. Последнее предпочтительное, так как это тот вариант, что позволит выкинуть тебе кучу мусора из твоей головы.

И вообще, аналогичным же образом реализуется целочисленная математика. Какия-тут нужна литература — ума не приложу.
В случае FP-чисел нужен текст стандарта IEEE 754. Можно начать знакомиться с таких статей.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Расчеты с точностью до n знаков после запятой (n>15)

Сообщение ger_kar » 24.12.2011 (Сб) 5:10

Хакер писал(а):вместо аппаратной реализации операций нужна программная.
Помнится, я начинал программировать на 8-разрядном процессоре КР580ВМ80 (I8080), так там даже аппаратной поддержки умножения и деления целочисленной арифметики не было, не говоря про арифметику с плавающей запятой, а максимальная разрядность была 16-х при использовании регистровой пары. И посему приходилось практически для всех математических операций писать свои программы на ассемблере. Самое странное, как это сделать на ассемблере сейчас я представляю вполне отчетливо, но вот как тоже самое проделать на VB ума не приложу.
Интересно можно ли вообще такое реализовать исключительно стандартными средствами VB (т.е. без ассемблерных и Сишних подпрограмм)?
Хакер писал(а):Можно начать знакомиться с таких статей.
Спасибо. Почитаю для общего развития :)
Бороться и искать, найти и перепрятать

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Расчеты с точностью до n знаков после запятой (n>15)

Сообщение Хакер » 24.12.2011 (Сб) 5:12

ger_kar писал(а):но вот как тоже самое проделать на VB ума не приложу.

Это печально.

ger_kar писал(а):Интересно можно ли вообще такое реализовать исключительно стандартными средствами VB (т.е. без ассемблерных и Сишних подпрограмм)?

Почему нет? Никаких преград.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Sam777e
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 157
Зарегистрирован: 16.09.2010 (Чт) 4:33

Re: Расчеты с точностью до n знаков после запятой (n>15)

Сообщение Sam777e » 24.12.2011 (Сб) 6:27

Rody66 писал(а): Может литература какая на эту тему имеется?

Rody66 писал(а):Но все-таки, на самом деле хотелось бы узнать способы вычислять до любой произвольной точности (например, до 1000 знаков)

http://www.proklondike.com/books/cpp/am ... mmers.html
Леен Аммерааль STL для программистов на C++
ДМК Пресс, 1999. — С. 240. — ISBN 5-256-00704-1.

На мой взгляд - эта книга и, вообще, STL - как песня. Вот что значит целостная продуманная концепция.

STL-Pi.PNG
STL-Pi.PNG (5.16 Кб) Просмотров: 3012


ger_kar писал(а):Интересно можно ли вообще такое реализовать исключительно стандартными средствами VB (т.е. без ассемблерных и Сишних подпрограмм)?

Для целочисленных типов [ Byte, Integer, Long ] можно с легкостью манипулировать любым битом - и, в случае длинной целочисленной арифметики, этим всё сказано.
Здоровья и удачи

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Re: Расчеты с точностью до n знаков после запятой (n>15)

Сообщение Viper » 24.12.2011 (Сб) 7:03

alibek писал(а):Для расчетов с высокой точностью используются дополнительные модули или классы. Можно поискать на форуме (помоему Viper выкладывал), можно написать самому — если не брать тригонометрию, там ничего сложного.
Не припомнаю, чтобы я выкладывал модуль, но в этом направлении возился. В общем-то действительно ничего сложного. Статья+исходники (ЕМНИП С++) лежит тут. И, насколько я помню, работа с длинными числами есть в библиотеке ALGLIB, которая находится здесь. ALGLIB реализиована по C++, C#, Pascal, VB (VB.NET также).
Весь мир матрица, а мы в нем потоки байтов!

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Расчеты с точностью до n знаков после запятой (n>15)

Сообщение Mikle » 24.12.2011 (Сб) 9:39

Rody66 писал(а):Может я что-то не так делал, но в бейсике максимальное кол-во знаков после запятой у типа Double, я добился 15. Судя по линку, в делфи это чило 20.

Перечитай ещё раз первый пост Алибека.
Хакер писал(а):Почему нет? Никаких преград.

Скорее не преграды, а усложнение и удлиннение алгоритма из-за отсутствия возможности производить действия, не боясь переполнения, и использовать флаг "c" в качестве слагаемого.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 60

    TopList