powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Задачка
25 сообщений из 77, страница 2 из 4
Задачка
    #40058704
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.лядь...

тем, что выражение вида
x = x+1
когда x - целочисленного типа, обязано либо поменять значение x, либо вызвать ошибку времени выполнения.

А для типа double изменение исходного значения x таким выражением не гарантировано.

Если вам не нравится 1, напишите вместо него 1000000, с тем же результатом - изменение значения double не гарантируется.
Double близко расположены друг к другу вблизи нуля, с увеличением расстояния по краям.
С учетом максимально выразимых в double значений, вам не поможет ни миллиард, ни триллион. Добавляйте сразу гугол.

Это невинный ребенок 5 лет способен понять.
А если это не понятно в 12, то вся будущая жизнь программиста будет прожита зря.
...
Рейтинг: 0 / 0
Задачка
    #40058707
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby, если бы вы не горячились так сильно, то, возможно, поняли бы, что ваше
booby
когда x - целочисленного типа, обязано либо поменять значение x, либо вызвать ошибку времени выполнения.

А для типа double изменение исходного значения x таким выражением не гарантировано.
-- эквивалентно моему
Иван FXS
i обязательно поменяется в some_proc_long(), если diii<>0, а x может не поменяться в some_proc_double() -- не смотря на то, что dxxx<>0
-- причем местами почти дословно: " обяза-но " -- " обяза тель но "
...
Рейтинг: 0 / 0
Задачка
    #40058709
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
лучше бы вы свой настоящий вопрос сформулировали, чем загадками разговаривать.
Если вопрос в том, а как же складывать double-значения?

То ответ на него не требует двух страниц:
используйте сложение по Кахану (компенсационное суммирование, William Kahan)

Есть альтернативный алгоритм - сложение на счетной линейке (абаке).
Он старше, в среднем обеспечивает чуть меньшую точность, но в отсутствии знакопеременности,
и в случае, когда каждое из слагаемых мало отличается по величине, обеспечивает приемлемую и скорость и точность.
...
Рейтинг: 0 / 0
Задачка
    #40058712
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby,

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

... Начали мне объяснять, что нужно быть осторожным с повторным вызовом встроенной функции Sqr() от того же самого аргумента ... ну песня же!

booby
в общем случае, не осторожно этого ожидать даже при использовании одного и того же способа вычисления:
Код: vbnet
1.
2.
3.
Dim x As Double, x1 As Double, x2 As Double
Let x = Sqr(2#)
Let x1 = Sqr(2#)

...
Рейтинг: 0 / 0
Задачка
    #40058713
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ясно.
то есть, вопроса у вас нет.
Тоже хорошо.
...
Рейтинг: 0 / 0
Задачка
    #40058718
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXS

... Начали мне объяснять, что нужно быть осторожным с повторным вызовом встроенной функции Sqr() от того же самого аргумента ... ну песня же!

Да вы поэт.
Но вам не хватает точности цитирования.
Говорилось вам следующее: в общем случае, при использование одного и того же вычислительного процесса,
на одних и тех же входных данных, нет гарантий, для типа double будет получено одно и то же двоичное представление значения.

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

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

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

А уж смешит это вас или печалит - это вопрос о том, как совсем малый культур-мультур в области вычислений получить.
...
Рейтинг: 0 / 0
Задачка
    #40058719
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вам, кстати, как любителю статистических вычислений, должен быть известен такой термин - робастность .
Для алгоритмов, предназначенных для использования в комбинации со значениями типа double - это самостоятельный
технический термин, являющийся характеристикой алгоритма .

Он и пишется и звучит не так, как пишется и звучит "встроенная функция".
...
Рейтинг: 0 / 0
Задачка
    #40058721
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby, когда кто-то пытается мысль про алгоритмы (и какое-то не пойми что "вычислительные процессы") то ли проиллюстрировать, то ли даже выразить средствами в виде примеров кода, то получается вот это вот
Код: vbnet
1.
2.
Let x = Sqr(2#)
Let x1 = Sqr(2#)



-- а ведь какой-нибудь вьюноша прочитает-- и в самом деле, усомнится, всегда ли Sqr(2#) возвращает одно и то же значение...
...
Рейтинг: 0 / 0
Задачка
    #40058722
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXS
booby, когда кто-то пытается мысль про алгоритмы (и какое-то не пойми что "вычислительные процессы") то ли проиллюстрировать, то ли даже выразить средствами в виде примеров кода, то получается вот это вот
Код: vbnet
1.
2.
Let x = Sqr(2#)
Let x1 = Sqr(2#)


Вы бы распечатали это, лучше покрупнее.
Да и разглядывали вдумчиво перед сном.
...
Рейтинг: 0 / 0
Задачка
    #40058723
Eolt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby

К double это не относится, поэтому на равенство их сравнивать не рекомендуется ( как и на прямое неравенство).
Хотя соответствующие операции формально и определены.


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

Код: 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.
Option Explicit

Private Function pRound(ByVal Value As Double, ByVal Power As Double) As Double
    Dim TempValue As Double
    Dim tSign As Double
    TempValue = Value
    tSign = TempValue
    TempValue = Abs(TempValue)
    TempValue = TempValue * 10 ^ (Power * -1)
    TempValue = Fix(TempValue + 0.5)
    TempValue = TempValue / 10 ^ (Power * -1)
    pRound = TempValue * Sgn(tSign)
End Function

Sub zadachka()
    Dim x As Double, x1 As Double, x2 As Double
    Let x = Sqr(2#)
    Let x1 = Val(CStr(x))
   
    x = pRound(x, -8)
    x1 = pRound(x1, -8)
    
    If x <> x1 Then MsgBox "Elementary, Watson!"
    Let x2 = Val(CStr(x - x1))
    If x <> x1 + x2 Then MsgBox "What about this?"
End Sub

Private Sub Form_Load()
  zadachka
End Sub
...
Рейтинг: 0 / 0
Задачка
    #40058733
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXS
...
-- а ведь какой-нибудь вьюноша прочитает-- и в самом деле, усомнится, всегда ли Sqr(2#) возвращает одно и то же значение...

образование вьюноши начинается совершенно с другого конца.
понятие "одно и то же значение" для типа double - плохо определено .

Имеет значение не только манера сравнения, но и манера выполнения операций.
Ни сложение, ни умножение для double не ассоциативны. a*(b*c) не обязано быть равным (a*b)*c, вне зависимости от того,
что представляет собой * - сложение или умножение.

Да, конкретно для корня вычисление стандартизировано вообще в исходном стандарте IEEE-754 1985г, в отличие от синусов, например, и прочих "библиотечных функций".
И, конкретно корень, конкретно из 2, на двух процессорах одной модели одного и того же производителя, почти наверно
даст в точности то же самое двоичное представление.
Но это не повод для того, чтобы оценивать равенство значений двух переменных по равенству хранящихся в них двоичных представлений.

поищите, при случае, в гугле "мифы о вычислениях с плавающей точкой".
Вот вам миф номер два:
"Арифметические операции детерминированы. Поэтому, если я вычисляю z = x + y в двух местах программы так,
что нигде не изменяю значения x и y между этими вычислениями z, то результат, записанный в z должен быть одним и тем же".
...
Рейтинг: 0 / 0
Задачка
    #40058738
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby
Но это не повод для того, чтобы оценивать равенство значений двух переменных по равенству хранящихся в них двоичных представлений
-- это, типа, проверка на вшивость? Естественно, сначала значения приводятся к одному типу, а потом уже вычисляется значение выражения "х1=х2".

Кому именно "повод" или "не повод" -- "оценивать ... по равенству хранящихся в них двоичных представлений", я не понимаю. Вы скажите прямо, выражение х1=х2 для значений х1 и х2 типа Double вычислимо или не вычислимо в языке программирования VB? Я ваш ответ распечатаю и на стенку повешу.
...
Рейтинг: 0 / 0
Задачка
    #40058739
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby
Вот вам миф номер два:
"Арифметические операции детерминированы. Поэтому, если я вычисляю z = x + y в двух местах программы так,
что нигде не изменяю значения x и y между этими вычислениями z, то результат, записанный в z должен быть одним и тем же".
приведите пример кода на VB, разоблачающего этот миф.
...
Рейтинг: 0 / 0
Задачка
    #40058741
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXS
booby
Но это не повод для того, чтобы оценивать равенство значений двух переменных по равенству хранящихся в них двоичных представлений
-- это, типа, проверка на вшивость? Естественно, сначала значения приводятся к одному типу, а потом уже вычисляется значение выражения "х1=х2".

Кому именно "повод" или "не повод" -- "оценивать ... по равенству хранящихся в них двоичных представлений", я не понимаю. Вы скажите прямо, выражение х1=х2 для значений х1 и х2 типа Double вычислимо или не вычислимо в языке программирования VB? Я ваш ответ распечатаю и на стенку повешу.


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

Из-за этой, в частности, особенности прямые сравнения, вне специфического контекста, не имеют смысла.
Если вам известно, что в x сидит 10, а в y - 5, то без дополнительной информации нельзя ответить на вопрос - должны ли эти значения быть признаны за несомненно равные или безусловно различные.

Кстати, а когда придет ваша очередь ответить на вопрос - что же именно вы хотели сказать, или о чем спросить, в своем стартовом посте?
...
Рейтинг: 0 / 0
Задачка
    #40058753
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby
Результаты вычислений выражений на значениях типа double могут не иметь арифметического смысла,
ввиду катастрофической потери точности при вычислениях
арифметика на значениях типа Double реализована специфическим образом, а именно -- из того, что a+b=a не следует, что b=0. Вот и всё.

Но любому значению типа Double соответствует однозначно определяемое действительное ... даже не действительное, а рациональное число. И два Double-значения равны тогда и только тогда , когда равны эти выражаемые ими рациональные числа. Зачем вы так настойчиво и многословно мистифицируете существо равенства Double-значений -- мне не понятно.
booby
о чем спросить, в своем стартовом посте
ни о чём не хотел, это был поток сознания. Если бы хотел спросить, то и спросил бы, то есть закончил бы предложением в синтаксической форме вопроса (с вопросительным знаком в конце).
...
Рейтинг: 0 / 0
Задачка
    #40058757
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
для любого a выполняется a=a ,

и для любых a и b из a=b следует b=a

-- вот и всё , что требуется от равенства. Поэтому как раз равенство Double-значений является абсолютно полноценным равенством -- в отличие от других арифметических операций, которые как раз на Double-значениях реализованы неполноценно .
...
Рейтинг: 0 / 0
Задачка
    #40058776
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В "инженерных расчётах", ради которых и придумывались double, не принято
сравнивать результаты без учета относительной ошибки, накопленной в процессе счета.

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

Про рациональные числа - надеюсь, вы понимаете, что вообще представимы в компьютере лишь некоторые рациональные числа,
даже если речь не идет о фиксированных представлениях.
1/3, например, не представима ни в какой конечной двоичной форме.
...
Рейтинг: 0 / 0
Задачка
    #40058787
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby
А если процесс оказался таким, что в мантиссе итога не осталось ни одной точной значащей цифры предполагаемого результата,
то на руках у вас просто мусор, который не с чем сравнивать.
-- да, но это проблема совершенно не операции вычисления равенства -- a=b , оно же может быть дидактически записано как РАВНО(a, b) -- двух Double-значений.
booby
Про рациональные числа - надеюсь, вы понимаете, что вообще представимы в компьютере лишь некоторые рациональные числа
-- да, множество Double-значений вообще конечно, то есть оно соответствует конечному набору рациональных чисел.

Кстати, я там ещё одно свойство равенства упустил: если a=b и b=c , то a=c . Тоже абсолютно выполняется на Double-значениях.
...
Рейтинг: 0 / 0
Задачка
    #40058823
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXS
для любого a выполняется a=a ,

и для любых a и b из a=b следует b=a

-- вот и всё , что требуется от равенства. Поэтому как раз равенство Double-значений является абсолютно полноценным равенством -- в отличие от других арифметических операций, которые как раз на Double-значениях реализованы неполноценно .

последняя попытка.
Попробуйте помедитировать над требованиями к равенству:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Sub test_cmp()
  Dim x As Double, y As Double, z As Double
  z = (0.3 * 3) + 0.1

  x = 0.3
  x = 3 * x
  x = x + 0.1

  y = 1#
  Debug.Print x = y, x = z, y = z
  
End Sub 


И с учетом того, что результат, вообще говоря, может оказаться "платформозависимым".
...
Рейтинг: 0 / 0
Задачка
    #40058830
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby,

да, результат "False False True", то есть выражение "(0.3 * 3) + 0.1" имеет значение равное 1#,

а последовательность вычислений
Код: vbnet
1.
2.
3.
  x = 0.3
  x = 3 * x
  x = x + 0.1

дает результат, отличный от 1#. Это есть демонстрация существенной проблемы, заключённой в вычислениях со значениями типа Double (на самом деле, вычислений со смешанными типами -- Double и какое-то целое, наверно, Integer) ... но совершенно не проблема самого по себе (вычисления) равенства Double-значений.

Если у нас y=z, то они всегда будут равны, покуда кто-нибудь не поменяет явным образом значения одного из них (или оба). То есть это не "требования к равенству", а все "требования к равенству", которые можно к нему предъявлять, оно, равенство, исправно выполняет.

И, кстати, если выражение "(0.3 * 3) + 0.1" имеет значение равное 1#, то оно всегда -- в пределах целиком скомпилированного VB-кода -- будет иметь это значение, сколько бы раз вы (код) его не перевычисляли.
...
Рейтинг: 0 / 0
Задачка
    #40058841
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXS
...
Если у нас y=z, то они всегда будут равны, покуда кто-нибудь не поменяет явным образом значения одного из них (или оба). ...


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

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

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

Впрочем, up to you...
...
Рейтинг: 0 / 0
Задачка
    #40058844
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby
Это исторически не было так в железе со значениями вблизи нуля
не понял, у вас что, железо греется и биты в ячейках оперативной памяти "скачут"? И случается это именно и только с теми ячейками, которые задействованы в хранении Double-значений? А ячейки с Long-значениями стоят ... крепче гороха? Круто, чо!

Или, может быть, у вас при присвоении Double-значений биты теряются, типа

Код: vbnet
1.
2.
3.
Dim x as Double 
Let x = 3#
If x <> 3# Then MsgBox "Всё пропало, гипс снимают, клиент уезжает!" 
...
Рейтинг: 0 / 0
Задачка
    #40058941
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вообще, вопрос о самотождественности значений (переменных) -- это не вопрос о том, как работает функция сравнения значений (переменных) на равенство. Это вопрос онтологический: если никакая исполняемая часть кода не изменяет некоторое значение -- значение некоторой внутренней переменной этого кода, то оно должно оставаться неизменным (тождественным самому себе). Если кто-то считает иначе или даже просто не уверен в самотождественности значений (переменных) ... тогда ой!

И если вы присваиваете некоторой переменной значение некоторой другой переменной (или константы), то значением той переменной, которой присваивается, должно стать то значение, которое (ей) присваивается, иначе ... какой я поручик? ... иначе становится возможно вообще всё что угодно!
...
Рейтинг: 0 / 0
Задачка
    #40058948
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXS
... иначе становится возможно вообще всё что угодно...

Этим и хорош double - не нравится +0, возьмите -0, не любите -inf, может NaN вам больше понравится?
А уж как хорош веер настроек внутреннего округления при сохранении значения выражения в переменную...

Особенно приятно, что ими прикладной программист почти никогда не рулит, а, в частности,
Classic VB-программист - никогда не рулит - ест то, что дают.

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

А какое же это счастье, когда выходит новая версия хардварного вычислителя...
Вот еще вчера (0.3 * 3) + 0.1 не был равен 1#, а сегодня-то - аж истома по телу растекается.

Это вообще удачный тип для онтологических вычислений в области абстрактной математики.
...
Рейтинг: 0 / 0
Задачка
    #40058961
MX-9
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby,

наконец на форуме по-настоящему интересное обсуждение
спасибо и Вашему оппоненту
!!
...
Рейтинг: 0 / 0
25 сообщений из 77, страница 2 из 4
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Задачка
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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