Author Topic: Ошибка в функции ARRPUSH  (Read 1271 times)

0 Members and 1 Guest are viewing this topic.

NStra

  • Освоившийся
  • **
  • Posts: 45
  • Подпись под аватаром.
    • View Profile
Ошибка в функции ARRPUSH
« on: March 26, 2015, 08:20:52 AM »
Функция ARRPUSH добавляет в массив неверное число, если нужное превышает 16 символов.
Код:
Code: [Select]
ARRPUSH($ARRY,12345678901234567)
PRINT($ARRY[0])
HALT
Лог:
Code: [Select]
15:19:34 12345678901234568
Windows 7 Ultimate x32
Clickermann v4.11 (Последняя версия)
« Last Edit: March 26, 2015, 08:30:19 AM by NStra »
Тут должна быть подпись...

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Ошибка в функции ARRPUSH
« Reply #1 on: March 26, 2015, 09:21:19 AM »
Функция ARRPUSH добавляет в массив неверное число, если нужное превышает 16 символов.
Код:
Code: [Select]
ARRPUSH($ARRY,12345678901234567)
PRINT($ARRY[0])
HALT
Лог:
Code: [Select]
15:19:34 12345678901234568
Windows 7 Ultimate x32
Clickermann v4.11 (Последняя версия)

Это не ошибка, и уж тем более ARRPUSH здесь не при чём

Code: (clickermann) [Select]
$a = 12345678901234567
LOGWRITE($a)

Будет то же самое.

Это переполнение. Целые числа, как и в большинстве языков имеют свой диапазон.
В кликере целые ограничены 15 разрядами. В принципе, они остаются целыми до 18 разрядов, но точность младших разрядов при этом теряется, их просто негде сохранять.

Вот для наглядности
Code: (clickermann) [Select]
$a = 99999999999999
FOR($i=0, $i < 7)
   LOGWRITE($a)
   $a = $a * 10 + 1
END_CYC
HALT

Лог:
Code: [Select]
9:17:02 99999999999999
9:17:02 999999999999991
9:17:02 9999999999999910
9:17:02 99999999999999104
9:17:02 999999999999991040
9:17:02 999999999999991040*10+1
9:17:02 999999999999991040*10+1*10+1

А отдельного данных, типа "long", нет. Да и не нужен он пока.

Вопрос уже всплывал здесь http://crapware.aidf.org/forum/index.php?topic=132.0

Минимальные числа тоже имеют ограничения, и сплавающей запятой
Code: (clickermann) [Select]
$a= 0.0000000000001
LOGWRITE ($a)

Это будет минимальное число, добавить ещё один ноль не получится.

Диапазон немного странный, десятичный. В большинстве случаев он либо 32 либо 64 битный.
« Last Edit: March 26, 2015, 09:29:02 AM by Vint »