|
|
|
По поводу точности
|
|||
|---|---|---|---|
|
#18+
Никак не могу понять, сколько знаков в числе можно записать не теряя его точности. Подробнее: Начинаем к примеру писать- 1, потом, 12, потом, 123, потом 1234, потом 12345 и т.д После 10 знака точнее после числа 2147483647 число Integer будет интерпретировано как double(float), после 12 знаков оно будет иметь научную форму представления, а точнее - "1 знак до запятой, 11 знаков после запятой, после E+число знаков после запятой (например 1.23456789012E+015)". Так сколько цифр можно написать вообще чтобы точность числа не терялась или если перефразировать, то после какого разряда число начинает округлятся? Вот я например попробовал записать число 1881664346549316512820593664 (28 знаков), разделил его и получил верный результат. Это число получается в результате умножения 123456789012*123456789012*123456. Т.е я число 1881664346549316512820593664 разделил на 123456789012 потом на 123456789012 и получил 123456 (1881664346549316512820593664/123456789012/123456789012 = 123456). И понял что записанные мною 28 знаков не округлялись и соответственно у меня возник вопрос после какого знака начинается округление? В мануале по PHP написанно так - "Размер целого зависит от платформы, хотя максимум, как правило, ~1.8e308 с точностью около 14 десятичных цифр (это 64-битный IEEE-формат)." Но у меня получилось намного больше 14 знаков после запятой, ничего не понимаю. Обьясните или прокоментируйте эту ситуацию, может я просто запутался :( Заранее спасибо всем ответившим! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2006, 05:57 |
|
||
|
По поводу точности
|
|||
|---|---|---|---|
|
#18+
Всё несколько сложнее, нельзя сказать заранее, до скольки знаков после запятой сохраняется точность, например, см замечание . Собственно говоря, ситуация такова, что скорее следует говорить о том, что при любом количестве знаков после запятой тип float не является абсолютно точным. В случае, если нужно работать с числами, априорная точность которых задана наперёд, следует пользоваться модулем BCMath . А при работе с целыми числами произвольной длины -- модулем GMP . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2006, 06:42 |
|
||
|
По поводу точности
|
|||
|---|---|---|---|
|
#18+
Но максимальное число знаков после запятой, после которой начинается округление должно же существовать, это же не происходит случайно, разве может быть что в одном случае округляется после 14, в другом после 23, а в 3 после 41 знака или всё таки может? Вот я сделал ещё один пример: из числа 12345678901234567890123456789 (29 знаков) я вычел 12345678900000000000000000000 (29 знаков), этим я отсёк первые 10 символов и в результате я получил странное число 1.23456903906E+018. Т.е получилось, что первые 16 знаков правильные 1234567890123456 а после идут какие-то не понятно откуда взятые числа 903906. Откуда взялась 9 после 6 если бы округлилась то было была бы 8. Откуда взялись эти числа после 16 разряда (903906)? Может кто то пояснит? Максимально возможная точность мне нужна для вычисления больших факториалов (более 10 000!). При вычислении я использую массив, каждое значение массива должно быть максимальным для более быстрого вычисления, т.е чем меньше элементов массива тем меньше будет количество умножений. Подробнее: Например 100! будет выглядеть так Array ( [0] => 0 [1] => 0 [2] => 0 [3] => 0 [4] => 40000 [5] => 91686 [6] => 85210 [7] => 82511 [8] => 22375 [9] => 20827 [10] => 36979 [11] => 28625 [12] => 56518 [13] => 39761 [14] => 94146 [15] => 15608 [16] => 32299 [17] => 59999 [18] => 95217 [19] => 29638 [20] => 46859 [21] => 81621 [22] => 82643 [23] => 71596 [24] => 490 [25] => 62667 [26] => 23885 [27] => 81699 [28] => 41526 [29] => 44394 [30] => 26215 [31] => 933 ) Число читается с конца т.е получается число 933 26215 44394 41526 ......... Как видите каждый элемент массива состоит из 5 разрядов и например при вычислении 101! придётся уже каждый элемент(здесь 32 элемента) массива умножать на 101 т.е получается 32 умножения. А если использовать каждый элемент массива не из 5 разрядов а например из 12 то получается всего 14 элементов: Array ( [0] => 0 [1] => 0 [2] => 185210916864 [3] => 827223758251 [4] => 286253697920 [5] => 463976156518 [6] => 229915608941 [7] => 895217599993 [8] => 621468592963 [9] => 715968264381 [10] => 856266700490 [11] => 152681699238 [12] => 326215443944 [13] => 93 ) т.е придётся умножать всего 14 раз. И мне хотелось бы узнать, на сколько разрядов точности мне можно расчитывать? Спасибо всем ответившим! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2006, 07:37 |
|
||
|
По поводу точности
|
|||
|---|---|---|---|
|
#18+
Boik Максимально возможная точность мне нужна для вычисления больших факториалов (более 10 000!). При вычислении я использую массив, каждое значение массива должно быть максимальным для более быстрого вычисления, т.е чем меньше элементов массива тем меньше будет количество умножений. Почитайте ссылки, что я дал, и вам не придётся изобретать велосипед. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2006, 07:42 |
|
||
|
По поводу точности
|
|||
|---|---|---|---|
|
#18+
Но мне надо сделать это без каких либо дополнительных модулей и библиотек, неужели никто не знает ответа на этот вопрос. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2006, 08:17 |
|
||
|
По поводу точности
|
|||
|---|---|---|---|
|
#18+
BoikНо максимальное число знаков после запятой, после которой начинается округление должно же существоватьА оно и существует. Только вот беда - двоичная система счисления и десятичная - это две абсолютно разные вещи.Максимально возможная точность мне нужна для вычисления больших факториалов (более 10 000!). http://algolist.manual.ru/maths/count_fast/factorial.php http://algolist.manual.ru/maths/count_fast/gamma_function.php[quote]При вычислении я использую массив, каждое значение массива должно быть максимальным для более быстрого вычисления, т.е чем меньше элементов массива тем меньше будет количество умножений.[/quote]Тогда вам, наверно, разумнее обходиться целочисленной арифметикой (она шустрее, чем floating point). Для PHP MAX_INT=2147483647. А вообще если речь о быстродействии - то инструмент (PHP) вами выбран неправильно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2006, 10:12 |
|
||
|
По поводу точности
|
|||
|---|---|---|---|
|
#18+
BoikНо максимальное число знаков после запятой, после которой начинается округление должно же существоватьА оно и существует. Только вот беда - двоичная система счисления и десятичная - это две абсолютно разные вещи.Максимально возможная точность мне нужна для вычисления больших факториалов (более 10 000!). algolist.manual.ru/maths/count_fast/factorial.php algolist.manual.ru/maths/count_fast/gamma_function.php При вычислении я использую массив, каждое значение массива должно быть максимальным для более быстрого вычисления, т.е чем меньше элементов массива тем меньше будет количество умножений.Тогда вам, наверно, разумнее обходиться целочисленной арифметикой (она шустрее, чем floating point). Для PHP MAX_INT=2147483647. А вообще если речь о быстродействии - то инструмент (PHP) вами выбран неправильно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2006, 10:14 |
|
||
|
|

start [/forum/topic.php?fid=23&msg=33480568&tid=1476972]: |
0ms |
get settings: |
10ms |
get forum list: |
19ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
193ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
36ms |
get tp. blocked users: |
1ms |
| others: | 256ms |
| total: | 535ms |

| 0 / 0 |
