А как 1С хранит числа в памяти? #608985


#0 by Ненавижу 1С
Собственно сабж, числовые значения как хранятся?
#1 by el-gamberro
В виде нулей и единиц.
#2 by IamAlexy
в памяти.. в памяти они хранятся.. иногда в файловом кеше...
#3 by Ахиллес
Где голосовалка с традиционным пунктом?
#4 by romix
Вещественно, кажись. Размерность можно выяснить делениями наподобие 1/3.
#5 by Адинэснег
не знаю как одинэс, а одинэсник должен одно число хранить в памяти... 86 400
#6 by IamAlexy
правильный 1сник напишет 24*60*60
#7 by el-gamberro
А как 1С хранит в памяти NULL и Неопределено?
#8 by Ахиллес
В виде дырки от бублика.
#9 by КМ155
флоат в формате IEEE тебя устроит ?
#10 by marvak
1C на MC++  вроде написан же? Как тот представляет так и 1С. Типа Int, Float.
#11 by pumbaEO
еще вопрос почему "неопределенно" лишилось одной буквы "н" в 1С?
#12 by orefkov
Смотри в 1С++ исходники класса CNumeric. В 8ке ничего не поменялось. Вкратце там указатель на буфер DWORD'ов, каждый из которых кодирует 9 знаков числа, число - позиция точки и знак.
#14 by romix
Вот кстати интересный код: Его вывод: n=215  d=5265614583427859334895901384183521615944754770027455562715548876 ....
#15 by romix
Где-то с 200-го умножения на 2 получается сбой в арифметике!
#16 by Ненавижу 1С
спасибо как всегда первая десятка флудеры ))
#17 by romix
А вот что происходит с последовательными делениями на 2: ... (но тут вроде все правильно)
#18 by НикДляЗапросов
как всегда ТС поленился написать чего ему надо
#19 by orefkov
Сбой не в арифметике, а в форматировании при выводе числа. Потенциально число в 1С - безразмерное, выдержит цифр, насколько памяти хватит. Единственно, при делении вроде до 13 знака идет округление.
#20 by romix
Вот еще здесь прикол в арифметике: Вывод: ... ...
#21 by orefkov
, Ага, вижу что до 20го знака. Давно уже это было, позабывал все.
#22 by zzerro
Просто разрядности числа (всего 64 знака) не хватает и все последние цифры обрезаются.
#23 by orefkov
Еще раз скажу - проблем в арифметике там нет. Есть проблемы преобразования из числа в строку при выводе, и из строки в число при вводе. (а d=9999999999999999999999999999999999999999999999999999999999999999; и есть преобразование компилятором из строки-текста программы в число).
#24 by Ненавижу 1С
кто хотел понять - понял, а ты не кусайся ))
#25 by NS
Ошибаешься. Нет там сбоя. Ограничение метода Сообщить там есть. Которое легко можно обойти.
#26 by НикДляЗапросов
Да я сам всегда так делаю, на собственном опыте вывод ))
#27 by romix
Да, действительно, 1000 умножений на 2 и затем 1000 делений на 2 возвращает результат к 1.
#28 by romix
Вот в этом опыте точно косяк с арифметикой: :-)    z=1+(1/3); Последнее значение выдачи: n=1000  d=0.99999999999999997559
#29 by romix
Или так и должно быть...
#30 by H A D G E H O G s
Или с бесконечной дробью
#31 by romix
Попробую ей буфер переполнить...
#32 by NS
До точки при операциях 1С хранит все знаки. После точки - не все. Я пример на 7.7 выкладывал ( в восьмерке тоже самое) Сейчас найду.
#33 by romix
100000 умножений на 2 и потом делений - полет нормальный.    z=2; Когда же она переполнится? :0)
#34 by NS
Пост Штатно считает корень из двух с 1000 знаками после точки.
#35 by NS
Буфер переполнить врятли сможешь. С увеличением числа скорость операции умножения резко падает. В итоге до переполнения не доходит.
#36 by Serginio1
#37 by romix
При возведении в квадрат на 20 шаге резко призадумалась. Снял задачу. :-)
#38 by romix
Похоже, 8 байт выделяет на "после точки" и произвольное число байт - "до точки".
#39 by romix
Но перемножение чисел длиной 2097152 шестн. знаков друг на дружку выполняется что-то намного дольше (не дождался исполнения), чем умножение чисел длиной 1048576 знаков. Похоже там где-то уже после мегабайта цЫфр идет сбой матрицы, 2 мегабайта уже не переваривает.
#40 by romix
Да вряд ли, там как раз дробный хвост выглядит размерностью 8 байт, а так было бы неэкономно в 20 байтах хранить то что можно в 8-и, и выравнивание в ОЗУ и все скорости исполнения бы пострадали.
#41 by romix
А может число с фиксированной точкой - их по идее легче реализовывать. Два DWORD-а на хвост после запятой...
#42 by romix
А вот так подвешивает 1С-ку 7.7 (нехватка ОЗУ и подвисание) на шаге 28:
#43 by Serginio1
Ну строка то у тебя 2 в 28 плюс возможна фрагментация памяти.
#44 by NS
ошибаешься. При умножении 1С хранит все знаки. Вот тут оригинал ветки из
#45 by romix
В 8.2 тоже обрушивает 1С. Так я же про дробную часть: на нее выделено 8 байт, это целая часть может разрастаться до мегабайта (потом все подвисает). А вообще круто - кажется нигде больше такого нет. Можно посчитать атомы в Галактике. :-)
#46 by Serginio1
Классы-оболочки Класс Class Java — полностью объектно-ориентированный язык. Это означает, что все, что только можно, в Java представлено объектами. Восемь примитивных типов нарушают это правило. Они оставлены в Java из-за многолетней привычки к числам и символам. Да и арифметические действия удобнее и быстрее производить с обычными числами, а не с объектами классов. Но и для этих типов в языке Java есть соответствующие классы — классы-оболочки (wrapper) примитивных типов. Конечно, они предназначены не для вычислений, а для действий, типичных при работе с классами — создания объектов, преобразования объектов, получения численных значений объектов в разных формах и передачи объектов в методы по ссылке. На рис. 4.1 показана одна из ветвей иерархии классов Java. Для каждого примитивного типа есть соответствующий класс. Числовые классы имеют общего предка — абстрактный класс Number , в котором описаны шесть методов, возвращающих числовое значение, содержащееся в классе, приведенное к соответствующему примитивному типу: bytevalue , doubievalue , floatValue , intValue, longValue , shortValue . Эти методы переопределены в каждом из шести числовых классов-оболочек. Рис. 4.1. Классы примитивных типов Помимо метода сравнения объектов equals о, переопределенного из класса object , все описанные в этой главе классы, кроме Boolean и class , имеют метод compareTo , сравнивающий числовое значение, содержащееся в данном объекте, с числовым значением объекта — аргумента метода compareTo . В результате работы метода получается целое значение: 0, если значения равны; отрицательное число (—1), если числовое значение в данном объекте меньше, чем в объекте-аргументе; положительное число (+1), если числовое значение в данном объекте больше числового значения, содержащегося в аргументе. Что полезного в классах-оболочках? Числовые классы В каждом из шести числовых классов-оболочек есть статические методы преобразования строки символов типа string лредставляющей число, в соответствующий примитивный тип: Byte.parseByte, Double.parseDouble, Float.parseFloat, Integer.parselnt, Long.parseLong, Short.parseShort . Исходная строка типа string , как всегда в статических методах, задается как аргумент метода. Эти методы полезны при вводе данных в поля ввода, обработке параметров командной строки, т. е. всюду, где числа представляются строками цифр со знаками плюс или минус и десятичной точкой. В каждом из этих классов есть статические константы MAX_VALUE и MIN_VALUE , показывающие диапазон числовых значений соответствующих примитивных типов. В классах Double и Float есть еще константы POSITIVE_INFINITY, NEGATIVE_INFINITY, NaN , о которых шла речь в главе 1, и логические методы проверки isNan , isInfinite . Если вы хорошо знаете двоичное представление вещественных чисел, то можете воспользоваться статическими методами floatTointBits и doubieToLongBits , преобразующими вещественное значение в целое. Вещественное число задается как аргумент метода. Затем вы можете изменить отдельные биты побитными операциями и преобразовать измененное целое число обратно в вещественное значение методами intsitsToFioat и longBitsToDouble . Статическими методами toBinaryString, toHexString и   toOctalString классов integer и Long можно преобразовать целые значения типов int и long , заданные как аргумент метода, в строку символов, показывающую двоичное, шестнадцатеричное или восьмеричное представление числа. В листинге 4.1 показано применение этих методов, а рис. 4.2 демонстрирует вывод результатов. Рис. 4.2. Методы  числовых классов ; Листинг 4.1. Методы числовых классов class NumberTest{  public static void main(String[] args){      Integer k2 = new Integer;      Double dl = new Double(3.14);      try{ } Методы parseint и конструкторы классов требуют обработки исключений, поэтому в листинг 4.1 вставлен блок try{} catch{} . Обработку исключительных ситуаций мы разберем в главе 16. Это очень небольшой класс, предназначенный главным образом для того, чтобы передавать логические значения в методы по ссылке. Конструктор Boolean (String s) создает объект, содержащий значение true , если строка s равна " true " в любом сочетании регистров букв, и значение false — для любой другой строки. Логический метод booieanvalue возвращает логическое значение, хранящееся в объекте. Класс Character В этом классе собраны статические константы и методы для работы с отдельными символами. digit(char ch, in radix) переводит цифру ch системы счисления с основанием radix в ее числовое значение типа int . forDigit(int digit, int radix) производит обратное преобразование целого числа digit в соответствующую цифру (тип char ) в системе счисления с основанием radix . Основание системы счисления должно находиться в диапазоне от Character.MIN_RADIX до Character.MAX_RADIX. Метод tostring переводит символ, содержащийся в классе, в строку с тем же символом. Статические методы toLowerCase , touppercase, toTitieCase возвращают символ, содержащийся в классе, в указанном регистре. Последний из этих методов предназначен для правильного перевода в верхний регистр четырех кодов Unicode, не выражающихся одним символом. Множество статических логических методов проверяют различные характеристики символа, переданного в качестве аргумента метода: isDef ined — выясняет, определен ли символ в кодировке Unicode;   isDigit — проверяет, является ли символ цифрой Unicode; isidentifierignorable — выясняет, нельзя ли использовать символ в идентификаторах; isisocontroi — определяет, является ли символ управляющим; isJavaidentifierPart — выясняет, можно ли использовать символ в идентификаторах; isjavaidentifierstart — определяет, может ли символ начинать идентификатор; isLetter — проверяет, является ли символ буквой Java; IsLetterOrDigit — Проверяет, является ли символ буквой или цифрой Unicode; isLowerCase — определяет, записан ли символ в нижнем регистре;   isSpaceChar — выясняет, является ли символ пробелом в смысле Unicode;   isTitieCase — проверяет, является ли символ титульным; isUnicodeldentifierPart — выясняет, можно ли использовать символ в именах Unicode; isunicodeidentifierstart — проверяет, является ли символ буквой Unicode;   isUpperCase — проверяет, записан ли символ в верхнем регистре;   isWhitespace — выясняет, является ли символ пробельным. Точные диапазоны управляющих символов, понятия верхнего и нижнего регистра, титульного символа, пробельных символов, лучше всего посмотреть по документации Java API. Листинг 4.2 демонстрирует использование этих методов, а на рис. 4.3 показан вывод этой программы. Листинг 4.2. Методы класса Character в программе CharacterTest   class CharacterTest{  public static void main(String[] args){   В класс Character вложены классы Subset и UnicodeBlock , причем класс Unicode и еще один класс, inputSubset , являются расширениями класса Subset , как это видно на рис. 4.1. Объекты этого класса содержат подмножества Unicode. Рис. 4.3. Методы класса Character в программе  CharacterTest Вместе с классами-оболочками удобно рассмотреть два класса для работы со сколь угодно большими числами. Все примитивные целые типы имеют ограниченный диапазон значений. В целочисленной арифметике Java нет переполнения, целые числа приводятся по модулю, равному диапазону значений. Для того чтобы было можно производить целочисленные вычисления с любой разрядностью, в состав Java API введен класс Biglnteger , хранящийся в пакете java.math . Этот класс расширяет класс Number , следовательно, в нем переопределены методы doubleValue, floatValue, intValue, longValue . Методы byteVaiue и shortvalue не переопределены, а прямо наследуются от класса Number . Действия с объектами класса Biglnteger не приводят ни к переполнению, ни к приведению по модулю. Если результат операции велик, то число разрядов просто увеличивается. Числа хранятся в двоичной форме с дополнительным кодом. Класс Big Decimal Класс BigDecimal расположен В пакете java.math . Каждый объект этого класса хранит два целочисленных значения: мантиссу вещественного числа в виде объекта класса Biglnteger , и неотрицательный десятичный порядок числа типа int . Например, для числа 76.34862 будет храниться мантисса 7 634 862 в объекте класса Biglnteger , и порядок 5 как целое число типа int . Таким образом, мантисса может содержать любое количество цифр, а порядок ограничен значением константы integer.MAX_VALUE . Результат операции над объектами класса BigDecimal округляется по одному из восьми правил, определяемых следующими статическими целыми константами:
#47 by Serginio1
плохо скопировал. Есть в яве Класс Biglnteger Все примитивные целые типы имеют ограниченный диапазон значений. В целочисленной арифметике Java нет переполнения, целые числа приводятся по модулю, равному диапазону значений. Для того чтобы было можно производить целочисленные вычисления с любой разрядностью, в состав Java API введен класс Biglnteger , хранящийся в пакете java.math . Этот класс расширяет класс Number , следовательно, в нем переопределены методы doubleValue, floatValue, intValue, longValue . Методы byteVaiue и shortvalue не переопределены, а прямо наследуются от класса Number . Действия с объектами класса Biglnteger не приводят ни к переполнению, ни к приведению по модулю. Если результат операции велик, то число разрядов просто увеличивается. Числа хранятся в двоичной форме с дополнительным кодом. Класс Big Decimal Класс BigDecimal расположен В пакете java.math . Каждый объект этого класса хранит два целочисленных значения: мантиссу вещественного числа в виде объекта класса Biglnteger , и неотрицательный десятичный порядок числа типа int . Например, для числа 76.34862 будет храниться мантисса 7 634 862 в объекте класса Biglnteger , и порядок 5 как целое число типа int . Таким образом, мантисса может содержать любое количество цифр, а порядок ограничен значением константы integer.MAX_VALUE . Результат операции над объектами класса BigDecimal округляется по одному из восьми правил, определяемых следующими статическими целыми константами:
#48 by Злопчинский
году этак перед 90-ым.. когда поплотнее столкнулся... был поражен до глубины души.. когда выяснилось что числа хранятся как текст... я понял, что этот мир обречен...
#49 by Злопчинский
про DBF речь...
#50 by Fragster
а зачем два счетчика?
#51 by Fragster
ну и максимальная точность - 32 почему-то
#52 by Kreont
Можно попробовать проверить через DynamicWrapperX, прямо читая с памяти Я когда так добирался к строкам то узнал много нового :) И про уникод, и про то что строка начинается через 4 байта вроде и тп.
#53 by H A D G E H O G s
Как адрес переменной узнаешь?
#54 by orefkov
Да нет там разницы в хранении до запятой и после. Есть буфер, в котором лежат цифры числа. И одно число, показывающее, где в этом буфере десятичная точка. При умножении сохраняются все цифры числа, при делении округляет до 20 знаков после запятой.
#55 by Kreont
о нашел мануал: под 7-ку, вроде так: Wrapper = CreateObject("DynamicWrapperX");
#56 by NS
и я про дробную часть. В примере 1. И куча знаков после точки. Нет ограничения.
#57 by romix
А здорово. Немножко не допилили до совершенства, а так было бы всем системам на зависть.
#58 by ILM
На баше вроде было: - Невье..бено большая сумма.
#59 by Кирпич
Насчет бесконечно больших чисел в 1с. Про функцию Exp написано: Если значение параметра настолько велико, что вызывает при вычислении арифметическое переполнение (параметр превышает 709.78271289338397, при этом значение последнего разряда не оказывает влияние на результат), то происходит ошибка "Неправильное значение аргумента встроенной функции (Exp)".
#60 by Torquader
а при передаче значений через ole-контекст происходит преобразование к стандартному типу double или currency,так как внутренние типы 1С наружу не передаются.
Тэги: 1С 8
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С