powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / MS Access отображает значения Double (Двойное с плав. точкой) не полностью?
84 сообщений из 84, показаны все 4 страниц
MS Access отображает значения Double (Двойное с плав. точкой) не полностью?
    #40126741
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в таблице на скриншоте поле R -- ключевое. Разницу значений покажу в первом комментарии (словами: она ~3.33Е-16)

Кстати, Debug.Print отображает эти значения также, как их видно на картинке.
...
Рейтинг: 0 / 0
MS Access отображает значения Double (Двойное с плав. точкой) не полностью?
    #40126742
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
MS Access отображает значения Double (Двойное с плав. точкой) не полностью?
    #40126775
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
MS Access отображает значения Double (Двойное с плав. точкой) не полностью?
    #40126789
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Панург, естественно, я обсуждаю отображение числа без форматирования. То есть, типа, полное.
...
Рейтинг: 0 / 0
MS Access отображает значения Double (Двойное с плав. точкой) не полностью?
    #40126796
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXS,

не бывает отображения числа без форматирования .
Увидеть то, что вы называете "полным" видом в строковом виде, отформатированном в виде числа для человеческого глаза нельзя.
Но вы можете завести двоичное поле на 8 байт с типом binary, записать туда свои числа, и уже после этого разглядывать разницу в их двоичных представлениях.

PS
Это странно - с упорством, достойным лучшего применения, из года в год заводить топики одной и той же степени удивления по части разницы между хранимым и отображаемым представлением числа, и прочих их особенностях.
Уже выберите время, и освойте тему фундаментально, раз она имеет для вас значение.
...
Рейтинг: 0 / 0
MS Access отображает значения Double (Двойное с плав. точкой) не полностью?
    #40126797
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby
из года в год заводить топики одной и той же степени удивления по части разницы между хранимым и отображаемым представлением числа
--вы точно ни с кем меня не путаете?

PS. Но да, я в самом деле уже понял в чём тут заковыка.
...
Рейтинг: 0 / 0
MS Access отображает значения Double (Двойное с плав. точкой) не полностью?
    #40126799
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ключевое поле...плавающая точка-сильно,однако
Стесняюсь спросить: а ЗАЧЕМ двойное с плавающей точкой-Вы хотите в таблице описать все звезды вселенной?
...
Рейтинг: 0 / 0
MS Access отображает значения Double (Двойное с плав. точкой) не полностью?
    #40126800
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby
не бывает отображения числа без форматирования
-- ну, если пустое поле "Формат" называть "форматированием" (плюс значение "Авто" в поле "число десятичных знаков"), то да, не бывает.

А также команду "Debug.Print x" в коде...

Иван FXS
booby
из года в год заводить топики одной и той же степени удивления по части разницы между хранимым и отображаемым представлением числа
--вы точно ни с кем меня не путаете?

PS. Но да, я в самом деле уже понял в чём тут заковыка.
...
Рейтинг: 0 / 0
MS Access отображает значения Double (Двойное с плав. точкой) не полностью?
    #40126801
DarkMan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sdku
Ключевое поле...плавающая точка-сильно,однако
Стесняюсь спросить: а ЗАЧЕМ двойное с плавающей точкой-Вы считаете количество звезд во вселенной?

Да и для звезд оно не особо то и подходит. :))
...
Рейтинг: 0 / 0
MS Access отображает значения Double (Двойное с плав. точкой) не полностью?
    #40126802
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sdku,

я проверял коллизии в самопальном ДСЧ. На 40-с-чем-то миллионном напоролся вот на это.
...
Рейтинг: 0 / 0
MS Access отображает значения Double (Двойное с плав. точкой) не полностью?
    #40126804
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXS
sdku,

я проверял коллизии в самопальном ДСЧ. На 40-с-чем-то миллионном напоролся вот на это.
А на что???
...
Рейтинг: 0 / 0
MS Access отображает значения Double (Двойное с плав. точкой) не полностью?
    #40126805
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXS
ну, если ... то да, не бывает.

Без если и то - просто НЕ БЫВАЕТ , никогда, потому что не может быть



Иван FXS
пропущено...
--вы точно ни с кем меня не путаете?

точно не путаю.
...
Рейтинг: 0 / 0
MS Access отображает значения Double (Двойное с плав. точкой) не полностью?
    #40126806
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sdku,

на то, что

Debug.Print R

выдал мне как-бы-значение коллизии, которого не оказалось в накопленных в таблице (предыдущих) значения ДСЧ.
...
Рейтинг: 0 / 0
MS Access отображает значения Double (Двойное с плав. точкой) не полностью?
    #40126807
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXS

А также команду "Debug.Print x" в коде...


Debug.print не отображает двоичное представление числа, а отображает, см выше, форматированное для человеческого глаза
приблизительное значение, которое в каких-то обстоятельствах случайно может оказаться даже и точным.
...
Рейтинг: 0 / 0
MS Access отображает значения Double (Двойное с плав. точкой) не полностью?
    #40126809
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby
точно не путаю.
а я думаю, что путаете.

"не отображает двоичное представление числа, а отображает"

-- да, спасибо, я уже понял не только это, но и то, что некоторые (на самом деле, почти все) значения типа Double просто не могут быть точно/полностью отображены в десятичной нотации.
...
Рейтинг: 0 / 0
MS Access отображает значения Double (Двойное с плав. точкой) не полностью?
    #40126810
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXS,

ура.
...
Рейтинг: 0 / 0
MS Access отображает значения Double (Двойное с плав. точкой) не полностью?
    #40126813
ROI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sdku
Иван FXS
sdku,

я проверял коллизии в самопальном ДСЧ. На 40-с-чем-то миллионном напоролся вот на это.
А на что???

На невозможность создать свой генератор случайных чисел(без знаний)
ТС пытается создать свой генератор из г**на и палок.
Вас ни с кем не спутаешь.
...
Рейтинг: 0 / 0
MS Access отображает значения Double (Двойное с плав. точкой) не полностью?
    #40126815
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby,

ага, ура. Осталось ещё с-ура-катся по поводу того, что "десятичная нотация" (записи чисел) и "форматирование" -- это не одно и то же:

Debug.Print не выводит число целиком не потому, что "форматирует", а потому, что последняя десятичная цифра (представления) не определена.
...
Рейтинг: 0 / 0
MS Access отображает значения Double (Двойное с плав. точкой) не полностью?
    #40126816
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXS
booby,

ага, ура. Осталось ещё с-ура-катся по поводу того, что "десятичная нотация" (записи чисел) и "форматирование" -- это не одно и то же.

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

Результат преобразования обеспечивается с набором оговорок, рассуждающих о том, что преобразование произойдет с "достаточной"
(для инженерного вычисления, например) степенью точности.
...
Рейтинг: 0 / 0
MS Access отображает значения Double (Двойное с плав. точкой) не полностью?
    #40126817
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"чисел двоичной точности "??? (Это вы так переводите "Double"?)

booby
Результат преобразования обеспечивается с набором оговорок, рассуждающих о том, что преобразование произойдет с "достаточной" (для инженерного вычисления, например) степенью точности.


-- нет, Debug.Print х не заморачивается всем этим, а просто выводит все цифры десятичной нотации, которые определены .
...
Рейтинг: 0 / 0
MS Access отображает значения Double (Двойное с плав. точкой) не полностью?
    #40126818
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXS
"чисел двоичной точности "??? (Это вы так переводите "Double"?)


это они так называются в русском языке.
...
Рейтинг: 0 / 0
MS Access отображает значения Double (Двойное с плав. точкой) не полностью?
    #40126819
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXS

-- нет, Debug.Print х не заморачивается всем этим, а просто выводит все цифры десятичной нотации, которые определены .

я не знаю, на каком языке написано это предложение, и затрудняюсь до степени отказа, с его переводом на русский.
...
Рейтинг: 0 / 0
MS Access отображает значения Double (Двойное с плав. точкой) не полностью?
    #40126821
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
впрочем, у конкретного значения типа Double можно определить (вычислить) сколько угодно цифр его записи в десятичной нотации. Фишка (первая) в том, что точное отображение его сколь угодно длинной, но конечной записью в десятичной нотации может оказаться невозможной.

А вторая фишка состоит в том, что при (арифметических) операциях со значениями типа Double происходит округление, чтобы результат поместился обратно в значение того же типа Double, и именно в этом смысле "окончание" (десятичной нотации, например) числа "не определено".
...
Рейтинг: 0 / 0
MS Access отображает значения Double (Двойное с плав. точкой) не полностью?
    #40126822
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby
это они так называются в русском языке
русская языка богатое...
https://yandex.ru/search/?text=числа двоичной точности&lr=16
...
Рейтинг: 0 / 0
MS Access отображает значения Double (Двойное с плав. точкой) не полностью?
    #40126824
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
одинарная..двойная точность..плавающая точка-до хрена в дохреновой степени плюс единица-есть же "старые, добрые"-денежный,целое,длинное целое,действительное-не припомню чтоб на практике(лично мне) понадобился тип с плавающей точкой
...
Рейтинг: 0 / 0
MS Access отображает значения Double (Двойное с плав. точкой) не полностью?
    #40126825
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXS
booby
точно не путаю.
а я думаю, что путаете.


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

ЗЫ
Если вам "посередине" на самом деле нужна действительная арифметика удвоенной точности, не используйте хотя бы на этапе хранения вычисленных значений этот формат.
Уходите на восьмибайтные структуры двоичного хранения.
Применительно к Access это значит - храните полученные значения в полях binary(8).
Жизнь существенно упростится.
...
Рейтинг: 0 / 0
MS Access отображает значения Double (Двойное с плав. точкой) не полностью?
    #40126826
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXS
впрочем, у конкретного значения типа Double можно определить (вычислить) сколько угодно цифр его записи в десятичной нотации...

Умнее было было бы перестать писать совсем уж откровенный бред.
...
Рейтинг: 0 / 0
MS Access отображает значения Double (Двойное с плав. точкой) не полностью?
    #40126827
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sdku, не понял, какой именно термин в вашей реплике представляет тип Double (в VB)...
...
Рейтинг: 0 / 0
MS Access отображает значения Double (Двойное с плав. точкой) не полностью?
    #40126828
Фотография vmag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXS,

Посмотри свои две первые картинки...
Если ты оперируешь в голове яблоками, то оперируй только яблоками и всё будет хорошо...
Допустим ты положил в мусорное ведро яблоко не глядя...
Пока ты кроме яблок ничего не замечаешь - всё норм, одно яблоко положил - одно и лежит, вытащил его - тоже норм, - нет в ведре яблок...
А ты что делаешь?
Положил не глядя, потом достал яблоко из мусорного ведра и опа такой - а х.ле в ведре мусор лежит ???
Типа яблоко нагадило...
По идее, если оперируешь чисто яблоками, то мусор
-3.33....E-16 на самом деле равный 0,000000000000000333 не должен тебя особо напрягать (достаточная инженерная точность как писали ниже), если тебя это все таки напрягает - не выноси никому мозк и в первую очередь самому себе...
...
Рейтинг: 0 / 0
MS Access отображает значения Double (Двойное с плав. точкой) не полностью?
    #40126829
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby
тогда вот здесь, наверно, был другой Иван, или тот, что есть сейчас, уже все забыл - и почему после двойного преобразования двоичное представление меняется, и почему непосредственно сравнивать такие числа - не самая умная идея:
Задачка

кто старое:
booby
даже исходный x сам с собой на равенство/неравенство не вполне корректно сравнивать..
помянет, тому глаз вон.
...
Рейтинг: 0 / 0
MS Access отображает значения Double (Двойное с плав. точкой) не полностью?
    #40126833
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXS,
Из HELPа: "Тип данных double – 64-разрядная переменная с плавающей запятой."
Думаю,это сугубо моё личное мнение,не стоит слишком глубоко(достаточно базовых знаний-это обязательно) вникать в суть того,что не понадобится,а вот если понадобится-тогда и изучите
Поле двойной точности с плавающей запятой в качестве ключевого-здесь более интересно не что такое поле с плавающей запятой и как оно отображается,а как можно додуматься до использования его в качестве ключа
...
Рейтинг: 0 / 0
MS Access отображает значения Double (Двойное с плав. точкой) не полностью?
    #40126834
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sdku, могу только повторить: я искал коллизии в самопальном ДСЧ. И для этого складывал его результаты в таблицу. А чтобы быстрее проверять* новые результаты на совпадение со старыми -- приндексировал эту таблицу по этому (единственному, на самом деле) её полю.

То, что я употребил слово "ключ" вместо "индекс" -- ну, звиняйте. Я просто нажал в конструкторе кнопку с ключиком, чтобы создать индекс с уникальными значениями.

________________
* = на самом деле, просто проверять, слово "быстрее" тут лишнее
...
Рейтинг: 0 / 0
MS Access отображает значения Double (Двойное с плав. точкой) не полностью?
    #40126838
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXS
...Я просто нажал в конструкторе кнопку с ключиком, чтобы создать индекс с уникальными значениями.

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

Правильная работа ключа целиком основана на наличии точных правил, позволяющих надежно сравнивать значения,
как минимум, на равенство/неравенство.
Менее важно, но используется для сортировки предположение о надежности сравнения на меньше.
Здесь вы добровольно объявляете ключом поле с заведомо ненадежными правилами сравнения.
Маловероятно, что это может вас устроить.

И, это вы уже проходили , независимо от того, чей глаз от этого должен выкатиться.
...
Рейтинг: 0 / 0
MS Access отображает значения Double (Двойное с плав. точкой) не полностью?
    #40126847
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby
Здесь вы добровольно объявляете ключом поле с заведомо ненадежными правилами сравнения.
могу только повторить, что значения типа Double имеют абсолютно надежные правила сравнения -- как на равенство, так и на больше-меньше. Уверяю вас, индексация по полю "Двойное с плавающей точкой" работает исчерпывающе полнофункционально. (Иначе как бы она вообще могла присутствовать в функционале MS Access!)

PS. Ещё раз, если два значения типа Double (или "Двойное с плавающей точкой" в таблице) равны, то они будут оставаться равными всегда. А если не равны, то будут оставаться неравными.
...
Рейтинг: 0 / 0
MS Access отображает значения Double (Двойное с плав. точкой) не полностью?
    #40126852
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXS
....
значения типа Double имеют абсолютно надежные правила сравнения
....
PS. Ещё раз, если два значения типа Double (или "Двойное с плавающей точкой" в таблице) равны, то они будут оставаться равными всегда....
Кратко,точно,безапеляционно.
...
Рейтинг: 0 / 0
MS Access отображает значения Double (Двойное с плав. точкой) не полностью?
    #40126854
ROI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXS
могу только повторить, что значения типа Double имеют абсолютно надежные правила сравнения

смотря какая точность.
...
Рейтинг: 0 / 0
MS Access отображает значения Double (Двойное с плав. точкой) не полностью?
    #40126856
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sdku,

покажите код, в котором два значения типа Double, оставаясь каждое неизменным, то равны, то не равны друг другу.
...
Рейтинг: 0 / 0
MS Access отображает значения Double (Двойное с плав. точкой) не полностью?
    #40126857
ROI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby
тогда вот здесь, наверно, был другой Иван, или тот, что есть сейчас, уже все забыл - и почему после двойного преобразования двоичное представление меняется, и почему непосредственно сравнивать такие числа - не самая умная идея:
Задачка

ТС клинит.
Ему же объяснили он опять "за рыбу деньги"
...
Рейтинг: 0 / 0
MS Access отображает значения Double (Двойное с плав. точкой) не полностью?
    #40126858
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ROI
смотря какая точность.
а "какая точность" у кода
Код: vbnet
1.
2.
3.
4.
5.
Dim x1 as Double, x2 as Double
.....
If x1 = x2 Then MsgBox "x1 = x2"
If x1 < x2 Then MsgBox "x1 < x2"
If x1 > x2 Then MsgBox "x1 > x2"


?
...
Рейтинг: 0 / 0
MS Access отображает значения Double (Двойное с плав. точкой) не полностью?
    #40126872
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXS
sdku,
покажите код, в котором два значения типа Double, оставаясь каждое неизменным, то равны, то не равны друг другу.
отвечу так: до 8 байт (речь о 8 байтах потому что это тип дубль-зачем он при меньших размерах) все будет нормально,а потом начнутся "непонятки"-но если Вы не работаете с огромными числами(значениями) то ЗАНАХРЕНА Вам этот тип???? Ведь можно и микроскопом гвоздь забить,только не для этого он....
Может объясните ЗАЧЕМ Вам этот тип-уж очень интересно (сегодня это не так актуально,но лет 40 назад,если это не есть объективная необходимость, за такое расточительное отношение к ресурсам Вас бы к компьютеру близко не подпустили)
Иван FXS
sdku, могу только повторить: я искал коллизии в самопальном ДСЧ. И для этого складывал его результаты в таблицу. А чтобы быстрее проверять* новые результаты на совпадение со старыми -- приндексировал эту таблицу по этому (единственному, на самом деле) её полю...
Кроме как бестолковым баловством на уровне детсада назвать это нельзя.А еще посмотрите это 8116809
...
Рейтинг: 0 / 0
MS Access отображает значения Double (Двойное с плав. точкой) не полностью?
    #40126873
Фотография vmag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXS,

Уникум... за один топик счетчик уже 20-ку накрутил...


YouTube Video
...
Рейтинг: 0 / 0
MS Access отображает значения Double (Двойное с плав. точкой) не полностью?
    #40126876
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sdku
если Вы не работаете с огромными числами(значениями) то ЗАНАХРЕНА Вам этот тип????

-- какие огромные числа? У ДСЧ результат вообще [0;1).

В смысле "ЗАНАХРЕНА этот тип"? А какой использовать -- Single, что ли? Типа, экономить 4 байта на переменную? О чём вообще спич? Ну, Currency ... не понимаю, нафига он мне? В том ДСЧ, про который я сейчас говорю, вообще Decimal ( целочисленный !) внутри.

Код: vbnet
1.
2.
3.
Let myRnd2022_A = CDec("44485709377909") '44485709377909# '=C*0.1580449882180410270393622341
Let myRnd2022_B = CDec("11863279") '11863279 '=C*0.0000000421468335787267278647
Let myRnd2022_C = CDec(2# ^ 48)  '=281 474 976 710 656



Вы не знаете (и не можете знать), что я делаю (и что мне нужно), но как-то с гонором начинаете поучать.
...
Рейтинг: 0 / 0
MS Access отображает значения Double (Двойное с плав. точкой) не полностью?
    #40126877
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXS
booby
Здесь вы добровольно объявляете ключом поле с заведомо ненадежными правилами сравнения.
могу только повторить, что значения типа Double имеют абсолютно надежные правила сравнения -- как на равенство, так и на больше-меньше. Уверяю вас, индексация по полю "Двойное с плавающей точкой" работает исчерпывающе полнофункционально. (Иначе как бы она вообще могла присутствовать в функционале MS Access!)


1) за логикой своих высказываний все-таки лучше следить.
Иначе может оказаться, что в истинные они обращаются только при ложности посылок.
Для того чтобы индексация работала, необходим сам факт наличия правил сравнения, а термин "надежные",
по крайней мере, в использованном вами смысле, требует уточнения.

2) кое-что, похоже вы забыли. Попробую напомнить:
2.а) Стандарт предполагает наличие двух нулей - положительного и отрицательного.
У них разные двоичные представления, но для vba несомненно, думаю, что и для Access как субд тоже, они всегда точно равны.
По крайней мере, полученный однажды в индексе отрицательный ноль не даст там появиться второму положительному.
Существенно это для вашего случая или нет - издалека неведомо.
2.б) VBA тщательно оберегает вас от получения NAN в качестве результата вычисления простого выражения сорта sqr(-1)
Однако из этого не следует, что он точно и несомненно не сможет у вас приключиться в вашем не показанном вычислении.
Я не знаю, что с этим делает Access - запишет он NaN в таблицу или откажет.
Но, если вдруг запишет, то ключ немедленно превратится в тыкву, поскольку NaN ничему не равен, в том числе самому себе.
Один раз попавший в уникальный индекс NaN обязан попадать туда произвольное количество раз.

Дальнейшее к ключу, само по себе не относится, но...
с) По отношению к "надежному" сравнению, что бы это ни значило, обычно "естественно" предполагают применимость правила транзитивности.
То есть, если a = b И b = c ТО несомненно a = c
На чем строится ваша уверенность, что транзитивность вообще применима к действительным числам двойной точности.
d) Следующее "естественное" предположение, что из a = b несомненно следует, что 1000*a = 1000*b
Вот это не обеспечивалось исторически ни первоначальными формулировками стандарта ни первоначальными фактическими реализациями.
e) умножение действительных чисел двойной точности, в общем случае, некоммутативно:
a*b и b*a не обязаны давать один и тот же двоичный результат.

Даже если сейчас во всей этой теме что-то исправлено, как методом уточнения стандарта, так и методом внесения исправлений в
железо, свободно манипулировать утверждениями безапеляционного типа в такой теме можно,
при условии что вы точно знаете и понимаете все особенности своего окружения.

Удачи в борьбе с отображением значений действительных чисел.
...
Рейтинг: 0 / 0
MS Access отображает значения Double (Двойное с плав. точкой) не полностью?
    #40126878
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby
То есть, если a = b И b = c ТО несомненно a = c
На чем строится ваша уверенность, что транзитивность вообще применима к действительным числам двойной точности.
код, в котором она не выполняется -- на стол.

booby
d) Следующее "естественное" предположение, что из a = b несомненно следует, что 1000*a = 1000*b
Вот это не обеспечивалось исторически ни первоначальными формулировками стандарта ни первоначальными фактическими реализациями.
e) умножение действительных чисел двойной точности, в общем случае, некоммутативно:
a*b и b*a не обязаны давать один и тот же двоичный результат.
-- я вообще это не обсуждал, не забалтывайте простую тему:

если а равно b, то они будут равны всегда .
...
Рейтинг: 0 / 0
MS Access отображает значения Double (Двойное с плав. точкой) не полностью?
    #40126882
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXS
В том ДСЧ, про который я сейчас говорю, вообще Decimal ( целочисленный !) внутри.


Не надо хранить результаты вычислений, выполненных в арифметике cdec в полях binary double.
Для этого у Access есть тип Numeric, точно соответствующий формату внутреннего представления таких чисел

И вы опять ошибаетесь, целиком "целочисленные внутри" - currency, у них и арифметика целочисленная..
Наличие шкалы в decimal существенно отличает арифметику в этом типе от обычной целочисленной.
...
Рейтинг: 0 / 0
MS Access отображает значения Double (Двойное с плав. точкой) не полностью?
    #40126883
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXS


если а равно b, то они будут равны всегда .


Это критически зависит от года выпуска железа, по отношению к которому вы производите столь безумное суждение.
Они, исторически, могли оказываться равными при первом сравнении и не равными при втором.
...
Рейтинг: 0 / 0
MS Access отображает значения Double (Двойное с плав. точкой) не полностью?
    #40126884
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кстати

booby
d) Следующее "естественное" предположение, что из a = b несомненно следует, что 1000*a = 1000*b
Вот это не обеспечивалось исторически ни первоначальными формулировками стандарта ни первоначальными фактическими реализациями.


-- обеспечивается, конечно: вызов любой стандартной математической функции (в том числе и УМНОЖИТЬ(a, b)) с одними и теми же аргументами -- что явно так в сформулированном вами примере -- даёт всегда один и тот же результат.
...
Рейтинг: 0 / 0
MS Access отображает значения Double (Двойное с плав. точкой) не полностью?
    #40126885
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby
Это критически зависит от года выпуска железа


-- шумящее железо? Ну-ну. А 12345678 в нём у вас всегда равно 12345678?
...
Рейтинг: 0 / 0
MS Access отображает значения Double (Двойное с плав. точкой) не полностью?
    #40126887
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXS
кстати

booby
d) Следующее "естественное" предположение, что из a = b несомненно следует, что 1000*a = 1000*b
Вот это не обеспечивалось исторически ни первоначальными формулировками стандарта ни первоначальными фактическими реализациями.


-- обеспечивается, конечно: вызов любой стандартной математической функции (в том числе и УМНОЖИТЬ(a, b)) с одними и теми же аргументами -- что явно так в сформулированном вами примере -- даёт всегда один и тот же результат.

ваши домыслы, сами по себе для меня давно не интересны.
Извините.

Верить вы можете вообще во что угодно.
Даже в такую фигню, как "вызов функции умножения всегда дает тот же результат" применительно к волшебным binary double


Вероятно, даже более того, персонально вам разрешено верить и в то, что два последовательных преобразования десятичного литерала 1000 в двоичное представление тоже всегда дает один и тот же результат.
...
Рейтинг: 0 / 0
MS Access отображает значения Double (Двойное с плав. точкой) не полностью?
    #40126888
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby
Не надо хранить результаты вычислений, выполненных в арифметике cdec в полях binary double.
-- спасибо, я и не храню. Результат -- "случайное" число -- вывожу в Double. Для использования по назначению.

booby
Для этого у Access есть тип Numeric, точно соответствующий формату внутреннего представления таких чисел
-- в вашем может быть и есть, а в моём нет. Так что я вообще не понимаю, что это (за ненадобностью -- как любое, чего нет ).

booby
И вы опять ошибаетесь, целиком "целочисленные внутри" - currency, у них и арифметика целочисленная..
Наличие шкалы в decimal существенно отличает арифметику в этом типе от обычной целочисленной.
-- ещё раз, у меня там целочисленный decimal, и он остаётся таковым на протяжении всех -- тривиальных -- вычислений. Что decimal бывает и не целочисленный -- я знаю, спасибо.
...
Рейтинг: 0 / 0
MS Access отображает значения Double (Двойное с плав. точкой) не полностью?
    #40126889
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby
Даже в такую фигню, как "вызов функции умножения всегда дает тот же результат" применительно к волшебным binary double
код на стол.

Впрочем, я помню, что в вашей вселенной
booby
даже исходный x сам с собой на равенство/неравенство не вполне корректно сравнивать...
...
Рейтинг: 0 / 0
MS Access отображает значения Double (Двойное с плав. точкой) не полностью?
    #40126895
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
упсссс...
...
Рейтинг: 0 / 0
MS Access отображает значения Double (Двойное с плав. точкой) не полностью?
    #40126896
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXS


booby
Для этого у Access есть тип Numeric, точно соответствующий формату внутреннего представления таких чисел
-- в вашем может быть и есть, а в моём нет. Так что я вообще не понимаю, что это (за ненадобностью -- как любое, чего нет ).


В вашем тоже есть, только вы, может быть, не знаете, как его указать в визуальном интерфейсе.

Если при создании поля в конструкторе таблицы выбрать тип поля "числовой" и размер поля "двойное с плавающей точкой" - то то,
что получится в итоге - будет полем фиксированного размера с типом binary_double

А если в типе поля указать "числовой", а в размере сказать "действительное",
то ему можно задавать "точность" вплоть до 28, и тогда то, что получится, будет Numeric полем.

Проблема с ним только в том, что при любом способе его задания, вы не сможете хранить в нем результат произвольного decimal вычисления.
Только в рамках попадания в (точность, шкала).
Либо дробные хвосты обрежутся по шкале, либо значение не влезет в указанную точность.
Но если для вас достоверно значима только целая часть, то (28,0) позволит вам получить дополнительные разряды точного представления целого числа.
...
Рейтинг: 0 / 0
MS Access отображает значения Double (Двойное с плав. точкой) не полностью?
    #40126898
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby, в конструкторе таблиц вижу, да. Но я "пляшу" от кода (то есть VBA).
...
Рейтинг: 0 / 0
MS Access отображает значения Double (Двойное с плав. точкой) не полностью?
    #40126902
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXS
....Вы не знаете (и не можете знать), что я делаю (и что мне нужно)...
Это шедеврально. Значит вопрос на форуме задан точно,кратко и конкретно. Типа пойди туда-не знаю куда и принеси то-не знаю что. Хотя вот так было бы лучше:помогите/как создать генератор случайных чисел с разрядностью * эти числа будут участвовать в вычислениях/будут использованы в качестве идентификатора
Очень сожалею что ввязался-весь топик напоминает:"а брошу ка я им кость-посмотрим что будет" при полном отсутствии желания что-то узнать или чему-то научиться
...
Рейтинг: 0 / 0
MS Access отображает значения Double (Двойное с плав. точкой) не полностью?
    #40126905
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXS
....Вы не знаете (и не можете знать), что я делаю (и что мне нужно)...
Это шедеврально. Значит вопрос на форуме задан точно,кратко и конкретно. Типа пойди туда-не знаю куда и принеси то-не знаю что. Хотя вот так было бы лучше:помогите/как создать генератор случайных чисел с разрядностью * эти числа будут участвовать в вычислениях/будут использованы в качестве идентификатора
Очень сожалею что ввязался-весь топик напоминает:"а брошу ка я им кость-посмотрим что будет" при полном отсутствии желания что-то узнать, чему-то научиться, изменить свое мнение, если оно ошибочно
...
Рейтинг: 0 / 0
MS Access отображает значения Double (Двойное с плав. точкой) не полностью?
    #40126906
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sdku
помогите/как создать генератор случайных чисел с разрядностью * эти числа будут участвовать в вычислениях/будут использованы в качестве идентификатора
-- а что, так можно было?

(Вообще-то топик был, давно, полтора года назад: https://www.sql.ru/forum/1329007-1/kak-povysit-moshhnost-rnd-s-single-do-double . Лично для меня тема "многомерного" Монте-Карло -- в 100-мерном пространстве "разыгрываемых" параметров, например, -- так и продолжается...)
...
Рейтинг: 0 / 0
MS Access отображает значения Double (Двойное с плав. точкой) не полностью?
    #40126907
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sdku,

а этот пост бы написан совершенно не про Монте-Карло и даже не про ДСЧ. И, в общем, я разобрался, почему Debug.Print x не выдаёт точное значение числа (что ему мешает это сделать). Ну а дальше -- слово за слово -- мне начали объяснять, что нельзя индексировать поле с плавающей точкой (хотя, конечно, можно) и прочее.
...
Рейтинг: 0 / 0
MS Access отображает значения Double (Двойное с плав. точкой) не полностью?
    #40126914
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXS
booby, в конструкторе таблиц вижу, да. Но я "пляшу" от кода (то есть VBA).

Не знаю, какая у вас проблема.
в коде вы вообще можете сделать, все, что вам угодно, в пределах поддерживаемого синтаксиса.
Посмотрите, какие поля получаются, например, вот так:

Код: vbnet
1.
CurrentProject.AccessConnection.Execute "Create table bb_tbl(p1 numeric(20,8), p2 decimal, p_dbl number, p3 varbinary(8), p4 varbinary(28))", 128 



просто number создастся как binary_double, а p1 и p2 как "действительные" .

с просто указанием numeric/decimal есть одна проблема - оно тогда создается как numeric(18,0)
Хотя надо учесть что с ними были ранее проблемы ( районе access 2000-2003) с сортировкий и выгрузкой в текстовый формат.
Насчет varbinary(28) в общем это перехлест, в любом случае должно хватать и 17 байт для хранения любого значения,
вычисленного в cdec-арифметике.
Дальше весь вопрос в том - нужны ли они вам именно как числа при манипуляции с записями в таблице бд.


PS
В некоторых других системах указание Numeric без указания точности и шкалы, приводит к тому, что можно записывать вообще любое вычислимое в типе значение, но ms access в этом месте ведет себя иначе.
...
Рейтинг: 0 / 0
MS Access отображает значения Double (Двойное с плав. точкой) не полностью?
    #40126917
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby,

"... Create table bb_tbl(...)" -- это вы называете "в коде"? Это в коде, конечно, в том смысле, что это создание таблицы в коде/из кода.

В этом кейсе я использовал таблицу только для того, чтобы сохранить в ней 40 миллионов (как оказалось, а могло быть и 100 миллионов) значений датчика "случайных" чисел (ну и сверяться с ними -- делать .seek "=", x -- на основе индекса).
...
Рейтинг: 0 / 0
MS Access отображает значения Double (Двойное с плав. точкой) не полностью?
    #40126919
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXS,

ладно, сорри, я совсем перестал понимал, что у вас в коде, а что только для того, чтобы 40 миллионов раз...

Успехов в трудах.
...
Рейтинг: 0 / 0
MS Access отображает значения Double (Двойное с плав. точкой) не полностью?
    #40126930
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXS
booby
Это критически зависит от года выпуска железа


-- шумящее железо? Ну-ну. А 12345678 в нём у вас всегда равно 12345678?

Нет, трепет "шумящего железа", когда был, сводился, главным образов к битве между тупоконечниками и остроконечниками по вопросу о том, как правильно писать циклы.
Надо ли формулировать условие завершения while i < n, разрешив программе вернуть недостоверный результат расчета суммы массива,
в результате преждевременного "шумящего" перескока i через n,
или правильно написать while i <> n, разрешив при таком происшествии программе впасть в бесконечный цикл,
может быть, вплоть до авоста по перебору разрядности i.
Тогда становится "совершенно понятно", что такой перескок несомненно был, и расчет надо запустить заново.
Такой спор вряд ли может завершиться за разумное время.

Касательно чисел двойной точности, примерно так история лежала, и vba самого по себе она не касается,
а касается написания программ на c/c++,
но все-таки это история, о которой хотя бы из любопытства можно иметь какое-то представление:

В какой-то момент, если не ошибаюсь, в районе разработки pentium-5, в стандарт были внесены дополнения, касающиеся специального представления особо малых числе в районе нуля.
Сопроцессорная часть этого процессора, с самого начала разрабатывалась под эти "уточнения".
А дальше получилось вот что - математика для binary double всегда имела две реализации - "библиотечную" и "машинную".
традиционно в компиляторах c/c++ если не использованы прагмы, выбор определялся выбором уровня оптимизации кода при компиляции.
"библиотечную" часть к выходу процессора никто не правил.
А способ сохранения значения регистров при вызове функции из текущего куска кода зависел от того, какая математика использовалась.
Вы могли получить два равных малых значения, вычисленных в другой библиотеке, скомпилированной под использование
"машинной" арифметики, затем вызвать любую функцию и затем зачем-то сравнить снова два ранее уже сравнивавшихся значения.
В зависимости от того, что происходило с регистрами, содержащими эти значения - вытеснялись их предыдущие значения или нет,
вы могли получить что угодно - они могли сохранить свои исходные значения, оба обнулиться или обнулиться только какой-то один из них.

Оно то да, в красивой теории однажды полученное значение дальше не меняется, а в инженерной практике - как повезет в момент конкретной реализации.

В те времена бубен правильной сборки программ лежал так - ты не можешь выбрать уровень оптимизации при сборке большого проекта меньше, чем максимальный предполагаемый среди всех используемых в проекте библиотек.
...
Рейтинг: 0 / 0
MS Access отображает значения Double (Двойное с плав. точкой) не полностью?
    #40126937
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby,

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

И даже понять, как оно может поменяться при перекладывании из одной ячейки (области) памяти в другую (без преобразования типа) -- тоже.

Это же просто биты на нижнем машинном уровне.
...
Рейтинг: 0 / 0
MS Access отображает значения Double (Двойное с плав. точкой) не полностью?
    #40126944
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXS
booby,

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

И даже понять, как оно может поменяться при перекладывании из одной ячейки (области) памяти в другую (без преобразования типа) -- тоже.

Это же просто биты на нижнем машинном уровне.


где-то оно может и "просто биты", но не в числах двойной точности.

"просто биты" - не имеют типа, и, в этом смысле, сами по себе не являются значением .

Если код, сохраняющий значение регистра заранее знает, что оно несомненно типизировано, и представляет собой ни что иное
как число двойной точности, то "старый" код относится к определенным битам в представлении, говорящим "я сейчас представляю
особо малое число", именно как к мусору, появившемуся, например, в результате шума, недопустимому вообще в представлении
значения такого типа.
А дальше... дальше стандарт много чего предполагает, но этим почти всегда не располагают писатели на большинстве языков, а там, где могут влиять, полагаются на поведение по умолчанию.
В этом месте допустимо разное поведение - от выброса ошибки "ой мне тут грязь в регистре вместо значения подсунули", до просто тихой очистки значения в ноль.
...
Рейтинг: 0 / 0
MS Access отображает значения Double (Двойное с плав. точкой) не полностью?
    #40126945
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby,

"очистка значения в ноль" или оставление в нём чего-то там -- это полюбасу часть вычисления (нового значения). А по завершении вычисления зачем с ХРАНЯЩИМСЯ значением что-то делать? И даже при присвоении значения одной переменной (типа Double) другой переменной (типа Double) -- вы ожидает каких-то проверок, а не просто Move?
...
Рейтинг: 0 / 0
MS Access отображает значения Double (Двойное с плав. точкой) не полностью?
    #40126948
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby
в стандарт были внесены дополнения, касающиеся специального представления особо малых числе в районе нуля

-- кстати, что это за числа -- они с (отрицательным) значением (десятичного) порядка меньше стандартного для типа Double (который -324)? Экзотично, конечно, но тогда можно и "особо крупные" значения ввести в оборот -- со значениями (десятичного) порядка больше +308...
...
Рейтинг: 0 / 0
MS Access отображает значения Double (Двойное с плав. точкой) не полностью?
    #40126951
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXS,

8-байтный double и на 16 и на 32 разрядной машине занимает более одного регистра.
вот 32 разрядная машина, занято два регистра, а вам нужен сейчас, допустим, всего один из них для вызова дочерней функции, в кишках которой может потребоваться и второй.
В общем случае, вы не можете в такой ситуации сохранять 64-битное значение, сидящее в 2х регистрах кусками,
и кто-то должен сказать - "эй, это значение сломается, если освободить только один регистр".

Точно можете, если точно знаете, что там значения двух независимых интов, а иначе откуда-то должна взяться уверенность в правильном сборе значения назад при возврате управления в текущий код.

И да, проверка типа при присвоении несомненно происходит, весь вопрос когда.
В компилируемых языках - на этапе компиляции, в интерпретируемых на этапе фактического присвоения.
В норме, кстати это не может происходить с помощью Move - move связан с передачей владения значением.
Присвоение значений простых типов всегда осуществляется копированием.

Правильность работы обеспечена там (например в vba), где существует принудительная инициализация значения
объявленной типизированной переменной значением по умолчанию из множества допустимых для типа.
В прочих случаях, в языках где допускается существование переменных с не полностью сформированным значением ,
ответственность падает на программиста в виде "неопределенного поведения".
...
Рейтинг: 0 / 0
MS Access отображает значения Double (Двойное с плав. точкой) не полностью?
    #40126953
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXS
booby
в стандарт были внесены дополнения, касающиеся специального представления особо малых числе в районе нуля

-- кстати, что это за числа -- они с (отрицательным) значением (десятичного) порядка меньше стандартного для типа Double (который -324)? Экзотично, конечно, но тогда можно и "особо крупные" значения ввести в оборот -- со значениями (десятичного) порядка больше +308...


субнормальные числа.
И, с версией сопроцессора я ошибся, это был еще 8087

https://ru.wikipedia.org/wiki/Денормализованные_числа
...
Рейтинг: 0 / 0
MS Access отображает значения Double (Двойное с плав. точкой) не полностью?
    #40126956
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby,

ну, хорошо, когда повстречаюсь с тем, что значение типа Double при присвоении из одной переменной типа Double в другую переменную типа Double -- перестало быть равным само себе... обязательно вам об этом сообщу. Типа:

Код: vbnet
1.
2.
3.
4.
Dim a as Double, b as Double 
Let a = b
....
If a<>b then MsgBox "booby was wright!"
...
Рейтинг: 0 / 0
MS Access отображает значения Double (Двойное с плав. точкой) не полностью?
    #40126958
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXS
booby,

ну, хорошо, когда повстречаюсь с тем, что значение типа Double при присвоении из одной переменной типа Double в другую переменную типа Double -- перестало быть равным само себе... обязательно вам об этом сообщу. Типа:

Код: vbnet
1.
2.
3.
4.
Dim a as Double, b as Double 
Let a = b
....
If a<>b then MsgBox "booby was wright!"


Не равно самому себе, это когда a <> a
...
Рейтинг: 0 / 0
MS Access отображает значения Double (Двойное с плав. точкой) не полностью?
    #40126962
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby,

a <> a -- это значение переменной не равно само себе. А то, что я написал, это само значение не равно самому себе, безотносительно переменной, в которой оно лежит.
...
Рейтинг: 0 / 0
MS Access отображает значения Double (Двойное с плав. точкой) не полностью?
    #40126963
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В полной мере vba не даст вам насладиться этой этой темой, но на коротке, путем подглядывания в содержимое переменных на панели locals, можно, например, так:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
#If VBA7 Then
  Private Declare PtrSafe Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As LongPtr)
#Else
  Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)
#End If

Type t8byte
 a(7) As Byte
End Type

Sub test()
  Dim t As t8byte, a As Double
  t.a(0) = 127
  t.a(1) = 255
  t.a(2) = 255
  t.a(3) = 255
  t.a(4) = 255
  t.a(5) = 255
  t.a(6) = 255
  t.a(7) = 255
  
  CopyMemory a, t, 8
  
  a = a - 1
  a = a - 21
  a = a - 121
  a = a + 1000000
  a = a + a
  a = a - a
  
End Sub

...
Рейтинг: 0 / 0
MS Access отображает значения Double (Двойное с плав. точкой) не полностью?
    #40126967
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby,

вы продемонстрировали, что значение типа Double может быть таким, что для него не будут (правильно) выполняться элементарные арифметические операции. Прикольно, да.

Но я обсуждал не операции (со значениями), а равенство значений самим себе. И его, равенства, сохранение во времени.
...
Рейтинг: 0 / 0
MS Access отображает значения Double (Двойное с плав. точкой) не полностью?
    #40126968
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Собственно классическая история про этот тип выглядит так:
запустить в пошаговом режиме test_double_calc и наблюдать за происходящим:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
Function foo(ByVal v As Double)
  Dim y As Double
   y = v * v
   foo = (y / v)
End Function


Sub test_dbl_calc()
  Dim x As Double, y As Double
  ' прямое вычисление
  x = 1E-308
  y = (x * x) / x
  Debug.Print x, y, x = y
  
  Dim z As Double
' считаем через функцию
  z = foo(1E-308)
  Debug.Print x, y, z, x = y, x = z, y = z
  
End Sub



Множество прочих историй либо стухли по мере смены поколений железа, либо замены библиотек,
а какие-то из них у себя к проявлению Vba никогда не позволял, предпочитая стратегию с выбросом ошибки в определенных моментах.

Код в предыдущем посте получился с дефектом, не влияющим на фактическое поведение, но вот замена с добавлением пары фрагментов.
он, конечно, хрупкий, благодаря "особой безопасности" vba, но в самый общий курс дела приблизительно вводит.

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
#If VBA7 Then
  Private Declare PtrSafe Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As LongPtr)
#Else
  Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)
#End If

Type t8byte
 a(7) As Byte
End Type

Sub test()
  Dim t As t8byte, a As Double, b As Double
  ' NaN
  t.a(0) = 255
  t.a(1) = 255
  t.a(2) = 255
  t.a(3) = 255
  t.a(4) = 255
  t.a(5) = 255
  t.a(6) = 255
  t.a(7) = 127

  CopyMemory a, t, 8
 
  Let b = a
 ' Debug.Print a <> b

  a = a - 1
  a = a - 21
  a = a - 121
  a = a + 1000000
  a = a + a
  a = a - a
  
  '
  ' 0x fff0 0000 0000 0000 '-inf
  
  t.a(0) = 0
  t.a(1) = 0
  t.a(2) = 0
  t.a(3) = 0
  t.a(4) = 0
  t.a(5) = 0
  t.a(6) = 240
  t.a(7) = 255
  CopyMemory b, t, 8
  Let a = b
  Debug.Print a = b
  
  b = b + 100000000000#
  a = a - 100000000000#  
  Debug.Print a = b, a <> b
  
  b = b + b
  a = 10000000 * a  
  Debug.Print a = b, a <> b
 
  
  '7ff0 0000 0000 0000 ' inf
  t.a(0) = 0
  t.a(1) = 0
  t.a(2) = 0
  t.a(3) = 0
  t.a(4) = 0
  t.a(5) = 0
  t.a(6) = 240
  t.a(7) = 127
  CopyMemory a, t, 8  
  Let b = a 
  
  Debug.Print a = b, a <> b
  
  b = b + 100000000000#
  a = a - 100000000000#
  Debug.Print a = b, a <> b
  
  b = b + b
  a = 10000000 * a
  Debug.Print a = b, a <> b
End Sub

...
Рейтинг: 0 / 0
MS Access отображает значения Double (Двойное с плав. точкой) не полностью?
    #40126969
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXS,

для NaN по стандарту не существует понятия равенства самому себе.
Но это нельзя показать в Vba

Он настроен на то, что при обращении с ним без "хакерства", NaN не может быть получен ни при каких обстоятельствах.
У вас там точно все без "хакерства"?
...
Рейтинг: 0 / 0
MS Access отображает значения Double (Двойное с плав. точкой) не полностью?
    #40126970
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby,
....
' прямое вычисление
...
' считаем через функцию
...-- я не произносил никаких утверждение про вычисления , но только про то, происходит ли что-нибудь со значениями, если никто и ничто ничего с ними не делает .
...
Рейтинг: 0 / 0
MS Access отображает значения Double (Двойное с плав. точкой) не полностью?
    #40126973
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby
для NaN по стандарту не существует понятия равенства самому себе
-- а можете дать ссылку на раздел "стандарта" про равенство равенство значений, в котором сказано что-то типа:

"вообще говоря, понятия равенства самому себе значений типа Double не существует, потому что для некоторых значений типа Double его не точно существует"
?

Потому что если для некоторых А не существует Б, то это именно так и должно формулироваться:

"вообще говоря, Б для А не существует".
...
Рейтинг: 0 / 0
MS Access отображает значения Double (Двойное с плав. точкой) не полностью?
    #40126975
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby,

кстати, если к первому вашему примеру добавить любую из строчек
Код: vbnet
1.
2.
3.
  If a = a Then Debug.Print "NaN = NaN"
  If a <> a Then Debug.Print "NaN <> NaN"
  Let booooolean = (a = a) 

то видно, что вы в самом деле умеете (хакерски) засовывать в Double такое экзотическое значение, для которого выяснение вопроса, равно ли оно самому себе, не возможно.

Ну, хорошо, буду знать. Куда это меня продвигает? Это же речь о том, что VBA позволяет хранить в Double сущность (сущности?), которая не является числом. Ну, позволяет, ладно.

Не всё, что может находиться в значении типа Double, обязательно является числом. Запомнил.
...
Рейтинг: 0 / 0
MS Access отображает значения Double (Двойное с плав. точкой) не полностью?
    #40126976
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
прямым следствием "первого классического примера"
является вот такой второй и тоже классический:


Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
Function foo2(ByVal v As Double) As Double
  Dim y As Double
  y = v * v
  foo2 = y / 1E+308
End Function


Sub test_dbl_calc2()
  Dim x As Double, y As Double
  ' прямое вычисление, работает, благодаря внутреннему уму вычислятеля выражений
  x = 1E+308
  y = (x * x) / x
  Debug.Print y
  
  Dim z As Double
' считаем через функцию и получаем ошибку времени выполнения
  z = foo2(x)
  Debug.Print x, y, z, x = y, x = z, y = z
End Sub

...
Рейтинг: 0 / 0
MS Access отображает значения Double (Двойное с плав. точкой) не полностью?
    #40126977
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXS

Это же речь о том, что VBA позволяет хранить в Double сущность (сущности?), которая не является числом. Ну, позволяет, ладно.

числом оно не является.
Но является допустимым значением в множестве значений чисел двойной точности.
...
Рейтинг: 0 / 0
MS Access отображает значения Double (Двойное с плав. точкой) не полностью?
    #40126979
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby
Но является допустимым значением в множестве значений чисел двойной точности
ага, потому что здесь "числа двойной точности" есть просто/только имя типа данных. По-честному было бы писать не "числа двойной точности", а "«числа» двойной точности"...

Но мне по прежнему интересно, есть ли в стандарте (или в хелпах) VBA оговорки о том, что не все значения типа Double являются числами...
...
Рейтинг: 0 / 0
MS Access отображает значения Double (Двойное с плав. точкой) не полностью?
    #40126980
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXS

"вообще говоря, понятия равенства самому себе значений типа Double не существует, потому что для некоторых значений типа Double его не точно существует"
?

Нет
Дело принципиально совсем в другом.
Вы беретесь за такой тип, в котором история как библиотечной, так машинной реализации которой много раз менялась.
Причем для целей, для которых, как кажется, выбранный вами тип случаен по существу.
У него не просто длинная история, а такая длинная, которая много длинней истории самого стандарта.
И в этой истории в разные времена были разные особенности.
Со временем она как-то меняется, а vba по по своему еще и защищает от некоторых ее особенностей.

Смысл всех рассказов состоит вот в чем - если цель вашего использования чисел двоичной точности по сути случайна к его
родным по исходному назначению собственным задачам и целям - не трогайте его.

В истории любые ваши предположения о нем как о "нормальном типе", на определенных отрезках не оправдывались.
Начиная с транзитивности, если a = b и b = c, то a = c, через сравнение с самим собой, и заканчивая чудесами с сохранением навсегда однажды полученного значения.

Это сложный тип, со сложной историей.
Благоразумней не трогать его, чем отстаивать любые абстрактные идеи, касающиеся того,
каким должен, а каким не может быть правильный тип, предназначенный для использования в компьютерах.
...
Рейтинг: 0 / 0
MS Access отображает значения Double (Двойное с плав. точкой) не полностью?
    #40126982
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby
выбранный вами тип случаен по существу
вообще не понимаю этого утверждения. Я просто всегда применял его для вычислений с вещественными (они же действительные, они же real по-английски) числами. Начиная с REAL*8 в Фортране 40 лет назад. И совершенно не понятно, что вы хотите (можете) предложить мне взамен.

Ещё раз, ну, узнал я про NaN в Double, -- это меня совершенно не обеспокоило. На том, что Debug.Print x не распечатывает число целиком, -- я, хотя бы, запнулся, а тут...
...
Рейтинг: 0 / 0
MS Access отображает значения Double (Двойное с плав. точкой) не полностью?
    #40126984
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXS
Debug.Print x не распечатывает число целиком


нет проблем распечатать целиком:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
#If VBA7 Then
  Private Declare PtrSafe Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As LongPtr)
#Else
  Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)
#End If

Type t8byte
 a(7) As Byte
End Type

Sub print_double_hex(ByVal x As Double)
  Dim i&, t As t8byte

  CopyMemory t, x, 8

  Debug.Print "Hx";
  For i = 7 To 0 Step -1
    Debug.Print Hex(t.a(i));
  Next
  Debug.Print

End Sub

Sub test_print()
  Dim a As Double

  a = 1 / 3
  print_double_hex a

End Sub

...
Рейтинг: 0 / 0
84 сообщений из 84, показаны все 4 страниц
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / MS Access отображает значения Double (Двойное с плав. точкой) не полностью?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]