|
Отлегло о сердца - в ТЗ можно хранить числа разных форматов.... | ☑ | ||
---|---|---|---|---|
0
Гений 1С
гуру
05.12.07
✎
16:41
|
Известно, что в 1С числовые реквизиты могут принимать значения не более чем из 32 значащих цифр.
Но в таблице значений можно хранить числа с гораздо большим числом разрядов - я просто боялся, что если в тз в одну колонку попадут числа из реквизитов разной разрядности, они пропадут. Интересно, а при создании колонки в ТЗ можно использовать квалификаторы большие, чем 32? Т.е. наверное в памяти можно использовать большую разрядность, чем в базе данных. Информации о максимальном возможном в 1с числе не нашел. Эксперименты ставить лень. А=1234567890123456789012345678901234567890; Б=0.1234567890123456789012345678901234567890; ТЗ=Новый ТаблицаЗначений(); ТЗ.Колонки.Добавить("Значение"); Стр=ТЗ.Добавить(); Стр.Значение=А; Стр=ТЗ.Добавить(); Стр.Значение=Б; обВывестиТаблицуЗначений(Новый Структура("ТЗ", ТЗ)); Вывело таблицу: Значение 1 234 567 890 123 456 789 012 345 678 901 234 567 890 0,123456789012345678901234567890123456789 |
|||
1
Immortal
05.12.07
✎
16:43
|
вот те вопросик ..почему Выполнить("" + Число1 + "" + Число2)
где Число1 = Число2 = 0,123456789012345678901234567890123456789 не работает, а работает только с Окр? |
|||
2
Immortal
05.12.07
✎
16:43
|
НПП я там убираю
|
|||
3
Гений 1С
гуру
05.12.07
✎
16:44
|
Еще пример:
А=1234567890123456789012345678901234567890; Б=0.1234567890123456789012345678901234567890; ТЗ=Новый ТаблицаЗначений(); //ТЗ.Колонки.Добавить("Значение"); ТЗ.Колонки.Добавить("Значение", Новый ОписаниеТипов("Число",Новый КвалификаторыЧисла(20,10))); Стр=ТЗ.Добавить(); Стр.Значение=А; Стр=ТЗ.Добавить(); Стр.Значение=Б; обВывестиТаблицуЗначений(Новый Структура("ТЗ", ТЗ)); Значение: 9 999 999 999,9999999999 0,123456789 |
|||
4
Гений 1С
гуру
05.12.07
✎
16:47
|
А вот еще код:
А=12345678901234567890123456789012345678901234567890123456789012345678901234567890; Б=0.12345678901234567890123456789012345678901234567890123456789012345678901234567890; ТЗ=Новый ТаблицаЗначений(); //ТЗ.Колонки.Добавить("Значение"); ТЗ.Колонки.Добавить("Значение", Новый ОписаниеТипов("Число",Новый КвалификаторыЧисла(120,60))); Стр=ТЗ.Добавить(); Стр.Значение=А; Стр=ТЗ.Добавить(); Стр.Значение=Б; обВывестиТаблицуЗначений(Новый Структура("ТЗ", ТЗ)); Вывод: 9 999,999999999999999999999999999999999999999999999999999999999999 0,12345678901234567890123456789012345678901234567890123456789 Мораль - в памяти 1с можно хранить максимум 64 значащих числа, что ровно в 2 раза больше, чем в памяти и это здорово, потому что гарантированно можно в одной колонке взять из базы реквизит с 32 знаками до запятой и с 32 знаками после запятой. |
|||
5
Immortal
05.12.07
✎
16:51
|
представляешь, это легко узнать когда делаешь этот самый реквизит..больше 32 тебе просто не даст ввести
|
|||
6
Черт
модератор
05.12.07
✎
16:54
|
"в памяти 1с можно хранить максимум 64 значащих числа, что ровно в 2 раза больше, чем в памяти" - 1с использует свою память?
|
|||
7
Гений 1С
гуру
05.12.07
✎
17:24
|
(6) чем в базе данных имелось ввиду. ;-)
|
|||
8
Immortal
05.12.07
✎
17:28
|
(7) гм..что я делаю не так : ввожу 32 знака в реквизите и указую точность 32?
|
|||
9
Immortal
05.12.07
✎
17:29
|
т.е. максимум и так понятно 64..
вот то что можно хранить 64 целое..хотя вопрос для каких задач. |
|||
10
Гений 1С
гуру
05.12.07
✎
17:36
|
(8) 32/32 - значит 32 разряда максимум, т.е. 32 знаков после запятой и ноль в целой части, не тупи.
(9) аналогично... |
|||
11
Immortal
05.12.07
✎
17:42
|
(10) ты сам тупишь.. 32,32 по твоему как храниццо?
|
|||
12
AndreYAN
05.12.07
✎
17:47
|
А что для 1С есть конфы для хранения данных по межгалактическим полетам? Зачем необходимо использовать реквизиты такого типа? Не догоняю :(
|
|||
13
MrRustam
05.12.07
✎
17:52
|
(12) ну например считать зарплату...
|
|||
14
AndreYAN
05.12.07
✎
17:53
|
(13) а ты оптимист :) Где ж такая бывает?!
|
|||
15
Immortal
05.12.07
✎
17:54
|
(13) сомневаюсь что там такие цифры.
|
|||
16
Фауст
05.12.07
✎
18:33
|
Собираетесь автоматизировать расчет массы электрона ?
|
|||
17
Hadgehogs
05.12.07
✎
18:55
|
Иронизируете?
А Гений1С - молодец. Неугомонный, раскопал. Респект. Похоже 1С может оперировать с числами (целыми) больше, чем 4(8) байта. В принципе, размерность числа не ограничена. Для этого ей приходится использовать свои алгоритмы сложения, вычитания, умножения и деления. А в базе хранить больше 64 бита - нельзя, ибо в SQL - максимальное целое - bigint(64 бита). |
|||
18
Михаил Козлов
05.12.07
✎
18:58
|
Любопытно, что и арифметические операции с такими числами делает (и, вроде, правильно). Надо будет попробовать решить какую-нибудь плохо обусловленную систему линейных уравнений. Помню, при вещественном типе из-за округлений численное решение было неверным при размерности = 18, а при двойном вещественном - при 23.
|
|||
19
AndreYAN
05.12.07
✎
19:06
|
Ладно, а чем не катит хранить в число в текстовом формате, и при необходимости преобразовывать его?
|
|||
20
Hadgehogs
05.12.07
✎
19:12
|
to (19) Избыточность
Лучше уж хранилище значений Счаст попробкю сохранить |
|||
21
hhhh
05.12.07
✎
19:12
|
(9) у меня 80 знаков получается, может имеется в виду 64 шестнадцатеричных?
Таб = Новый ТаблицаЗначений; Таб.Колонки.Добавить("а"); Таб.Колонки.Добавить("б"); Таб.Колонки.Добавить("в"); Стр = Таб.Добавить(); Стр.а = "0.111111111100000000001111111111000000000011111111110000000000111111111100000000001"; Стр.б = Число(Стр.а); Стр.в = Стр.б + Стр.б; Стр.в получается: 0.22222222220000000000222222222200000000002222222222000000000022222222220000000000222222222200000000002 |
|||
22
Hadgehogs
05.12.07
✎
19:16
|
О, работает...
|
|||
23
Immortal
05.12.07
✎
22:01
|
(21) нет, не 16 - ричные.
гм.. в таком случае получается что у 1с под это дело свой тип |
|||
24
Immortal
05.12.07
✎
22:02
|
я вот только не понимаю когда преобразование происходит. А оно происходит потому что иначе тормозульки при расчётах были бы дикие.
|
|||
25
AeDen
05.12.07
✎
23:27
|
Гений, вот если-б не твое отношение к женщинам и детям - уважал-бы...
|
|||
26
Гений 1С
гуру
06.12.07
✎
09:20
|
(11) дятел 32,32 - это 32 значащих цифры и позиция точки в начале т.е. ноль, точка и 32 разряда.
|
|||
27
Гений 1С
гуру
06.12.07
✎
09:24
|
(25) женщины - твари, дети - цветы.
|
|||
28
Гений 1С
гуру
06.12.07
✎
09:52
|
Таб = Новый ТаблицаЗначений;
Таб.Колонки.Добавить("а"); Таб.Колонки.Добавить("б"); Таб.Колонки.Добавить("в"); Стр = Таб.Добавить(); Стр.а = "0.11111111110000000000111111111100000000001111111111000000000011111111110000000000134342423423423423423423423423423423423423423423423422342342342342"; Стр.б = Число(Стр.а); Стр.в = Стр.б + Стр.б; Зн=Стр.в; сообщить(Зн); сообщить(СтрДлина(Формат(зн, "ЧГ="))-1); Зн=Стр.а; сообщить(СтрДлина(Формат(зн, "ЧГ="))-1); Сообщить(обМассивВСтроку(Таб.Колонки.в.ТипЗначения.Типы())); Сообщить(Таб.Колонки.в.ТипЗначения.КвалификаторыЧисла.Разрядность); Сообщить(Таб.Колонки.в.ТипЗначения.КвалификаторыЧисла.РазрядностьДробнойЧасти); Выдает пустой массив типов и квалификаторы по нулям. В общем, если тип не задан, т.е. квалификаторы числа равны нулю, то разрядность может быть любая!!!! |
|||
29
Гений 1С
гуру
06.12.07
✎
09:54
|
В доказательство вот вам код:
А=12345678901234567890123456789012345678901234567890123456789012345678901234567890; Б=0.12345678901234567890123456789012345678901234567890123456789012345678901234567890; ТЗ=Новый ТаблицаЗначений(); //ТЗ.Колонки.Добавить("Значение"); ТЗ.Колонки.Добавить("Значение", Новый ОписаниеТипов("Число",Новый КвалификаторыЧисла(0,0))); Стр=ТЗ.Добавить(); Стр.Значение=А; Стр=ТЗ.Добавить(); Стр.Значение=Б; обВывестиТаблицуЗначений(Новый Структура("ТЗ", ТЗ)); На выходе получаем: 12 345 678 901 234 567 890 123 456 789 012 345 678 901 234 567 890 123 456 789 012 345 678 901 234 567 890 0,1234567890123456789012345678901234567890123456789012345678901234567890123456789 Т.е. недокументированная возможность - при использования квалификатора числа с нулем разрядов его длина не ограничена, но видимо это сказывается на быстродействии расчетов. ;-) Такой тип используется в таблицах значений по умолчанию, если не указать тип. Однако в любом случае в базе нельзя хранить числа, более чем из 32 цифр... Все, тема раскрыта, постите в базу знаний.... |
|||
30
Гений 1С
гуру
06.12.07
✎
10:01
|
Вот что прикольно:
А=1/3; Сообщить(А); Сообщить(СтрДлина(А)); 0,333333333333333333333333333 29 Т.е. если политика хранения понятна, то политика арифметики еще требует исследований |
|||
31
Гений 1С
гуру
06.12.07
✎
10:02
|
А=12345678901234567890123456789012345678901234567890123456789012345678901234567890;
Б=0.12345678901234567890123456789012345678901234567890123456789012345678901234567890; ТЗ=Новый ТаблицаЗначений(); //ТЗ.Колонки.Добавить("Значение"); ТЗ.Колонки.Добавить("Значение", Новый ОписаниеТипов("Число",Новый КвалификаторыЧисла(0,0))); Стр=ТЗ.Добавить(); Стр.Значение=А; Стр=ТЗ.Добавить(); Стр.Значение=Б; Стр=ТЗ.Добавить(); Стр.Значение=Б/3; обВывестиТаблицуЗначений(Новый Структура("ТЗ", ТЗ)); Значение: 12 345 678 901 234 567 890 123 456 789 012 345 678 901 234 567 890 123 456 789 012 345 678 901 234 567 890 0,1234567890123456789012345678901234567890123456789012345678901234567890123456789 0,0411522630041152263004115226300411522630041152263004115226300411522630041152263 Т.е. если задан квалификатор, то разрядность соответствует разрядности числа... |
|||
32
Михаил Козлов
06.12.07
✎
18:43
|
Дополнение к (18).
Попробовал решить систему Годунова (плохо обусловленная системы линейных уравнений) методом Жордана-Гаусса. При размерности 64 дает 3 знака верных, 66 - уже 1. Но вообще-то впечатляет. |
|||
33
Гений 1С
гуру
07.12.07
✎
09:43
|
(32) код в студию!
|
|||
34
Скептик
07.12.07
✎
09:51
|
А говрят -- пятница, пятница...
Однако ж -- понедельник начинается не в субботу, а таки в вечер пятницы. Какие люди!.. (запасся патриотичными семечками и уютно уселся на патриотичном табурете) |
|||
35
Михаил Козлов
07.12.07
✎
14:34
|
(33) Код чего: Жордана-Гаусса или обработку, которая решает систему Горбунова?
И как выкладывают, если это действительно нужно? |
|||
36
Гений 1С
гуру
07.12.07
✎
14:44
|
(35) код обработки, выкладывают копи-пастом
|
|||
37
Михаил Козлов
07.12.07
✎
15:02
|
Изначально в паскалевском тексте индексы в массивах от 1. Неохота было переделывать на от 0, поэтому для матриц пришлось заводить массивы на 1 большего размера. Т.е. элементы массивов с индексом 0 не нужны. Переделать несложно, хотелось быстрее попробовать.
Перем MettErr; //ошибка метода. Не 0 - система несовместна Функция abs(x) Если x<0 Тогда Возврат -x; Иначе Возврат x; КонецЕсли; КонецФункции Процедура СкопироватьМассив(источник, приемник, сколько) ДЛЯ инд = 0 ПО сколько-1 Цикл приемник[инд] = источник[инд]; КонецЦикла; КонецПроцедуры Функция НовыйМассив(n) м = Новый Массив; ДЛЯ к=0 ПО n-1 Цикл м.Добавить(0.0); КонецЦикла; Возврат м; КонецФункции //a - матрица уравнений n x n //b - матрица правых n x m. При n = m и единичной b в результате получается обратная //n - число столбцов и строк //m - число правых частей //MethErr = 1 - матрица вырождена //MethErr = 2 - матрица вырождена Процедура GaussJ(a, n, b, m) Перем indxc, indxr, ipiv, buf; MethErr=0; indxc = НовыйМассив(n+1); indxr = НовыйМассив(n+1); ipiv = НовыйМассив(n+1); buf = НовыйМассив(n+1); ДЛЯ i=1 ПО n Цикл big=0.0; ДЛЯ j=1 ПО n Цикл Если (ipiv[j]<>1) Тогда ДЛЯ k=1 ПО n Цикл Если (ipiv[k]=0) Тогда Если abs(a[j][k])>=big Тогда big=abs(a[j][k]); irow=j; icol=k; КонецЕсли; ИначеЕсли ipiv[k]>1 Тогда MethErr=1; Возврат; КонецЕсли; КонецЦикла; КонецЕсли; КонецЦикла; ipiv[icol]=ipiv[icol]+1; Если (irow<>icol) Тогда СкопироватьМассив(a[irow], buf, n+1); СкопироватьМассив(a[icol], a[irow], n+1); СкопироватьМассив(buf, a[icol], n+1); СкопироватьМассив(b[irow], buf, m+1); СкопироватьМассив(b[icol], b[irow], m+1); СкопироватьМассив(buf, b[icol], m+1); КонецЕсли; indxr[i]=irow; indxc[i]=icol; Если a[icol][icol]=0.0 Тогда MethErr=2; Возврат; КонецЕсли; pivinv=1.0/a[icol][icol]; a[icol][icol]=1.0; ДЛЯ l=1 ПО n Цикл a[icol][l]=a[icol][l]*pivinv; КонецЦикла; ДЛЯ l=1 ПО m Цикл b[icol][l]=b[icol][l]*pivinv; КонецЦикла; ДЛЯ ll=1 ПО n Цикл Если (ll<>icol) Тогда dum=a[ll][icol]; a[ll][icol]=0.0; ДЛЯ l=1 ПО n Цикл a[ll][l]=a[ll][l]-a[icol][l]*dum; КонецЦикла; ДЛЯ l=1 to m Цикл b[ll][l]=b[ll][l]-b[icol][l]*dum; КонецЦикла; КонецЕсли; КонецЦикла; КонецЦикла; l=n; ПОКА l>0 Цикл Если (indxr[l]<>indxc[l]) Тогда ДЛЯ k=0 ПО n-1 Цикл dum=a[k][indxr[l]]; a[k][indxr[l]]=a[k][indxc[l]]; a[k][indxc[l]]=dum КонецЦикла; КонецЕсли; l=l-1; КонецЦикла; КонецПроцедуры //формирует систему Горбунова (2-х полосная) //Размер - размер системы //А - матрица, б - вектор правых частей, как двумерный массив Процедура СформироватьЗадачу(А, б) А = Новый Массив(Размер+1, Размер+1); б = Новый Массив(Размер+1, 2); ДЛЯ к = 1 ПО Размер Цикл ДЛЯ л=1 ПО Размер Цикл А[к][л] = 0.0; КонецЦикла; А[к][к] = 7/5; Если к<Размер Тогда А[к][к+1] = 11/3; КонецЕсли; б[к][1] = (152*к+118)/15/(2*к+1)/(2*к+3); КонецЦикла; б[Размер][1] = 7/5/(2*Размер+1); КонецПроцедуры Процедура СформироватьРешение(х) //для вывода результатов на форму Решение.Очистить(); //Решение - таб. часть обработки ДЛЯ к=1 ПО Размер Цикл стр = Решение.Добавить(); стр.Вычислено = Число(х[к][1]); стр.Точно = 1.0/(2*к+1); //точное решение системы Горбунова стр.Невязка = стр.Точно-стр.Вычислено; КонецЦикла; КонецПроцедуры Процедура РешитьЗадачу() ЭКСПОРТ Перем А,б,х; СформироватьЗадачуГ(А, б); GaussJ(А, Размер, б, 1); СформироватьРешение(б); КонецПроцедуры |
|||
38
luns
07.12.07
✎
15:14
|
Выдержка из описания встроенного языка: "Числовым типом может быть представлено любое десятичное число. Над данными числового типа определены основные арифметические операции: сложение, вычитание, умножение и деление. Максимально допустимая разрядность числа 38 знаков"
|
|||
39
Гений 1С
гуру
10.12.07
✎
10:55
|
(38) Трендят, в 8.1. как видишь больше знаков
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |