powered by simpleCommunicator - 2.0.19     © 2024 Programmizd 02
Map
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Задачка
77 сообщений из 77, показаны все 4 страниц
Задачка
    #40058504
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Sub zadachka()
Dim x As Double, x1 As Double, x2 As Double
Let x = Sqr(2#)

Let x1 = Val(CStr(x))
If x <> x1 Then MsgBox "Elementary, Watson!"

Let x2 = Val(CStr(x - x1))
If x <> x1 + x2 Then MsgBox "What about this?"
End Sub
...
Рейтинг: 0 / 0
Задачка
    #40058511
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
The Val function recognizes only the period ( . ) as a valid decimal separator.
...
Рейтинг: 0 / 0
Задачка
    #40058522
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HandKot, а у вас в настройках Винды указана запятая в качестве десятичного? Бывает...
...
Рейтинг: 0 / 0
Задачка
    #40058539
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXS
HandKot, а у вас в настройках Винды указана запятая в качестве десятичного? Бывает...

не мой выбор, политика партии :-)
...
Рейтинг: 0 / 0
Задачка
    #40058552
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HandKot, ну, вам придётся вставить Replace(....., ",", "."), если вы хотите добраться до конца задачки...
...
Рейтинг: 0 / 0
Задачка
    #40058556
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXS
HandKot, ну, вам придётся вставить Replace(....., ",", "."), если вы хотите добраться до конца задачки...
или использовать CDbl - оно вроде как будет использовать системный разделитель
...
Рейтинг: 0 / 0
Задачка
    #40058557
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вопрос-то вообще в чем?
Числа с плавающей запятой не сравнивают с помощью "=" и "<>" - в этом проблема? Ну так кури, как устроен Double
...
Рейтинг: 0 / 0
Задачка
    #40058563
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro
Числа с плавающей запятой не сравнивают с помощью "=" и "<>"
-- это утверждение мне кажется ложным.

Результаты вычислений (над числами с плавающей запятой) редко когда имеет смысл сравнивать с помощью "=" и "<>"

-- с этим соглашусь.
...
Рейтинг: 0 / 0
Задачка
    #40058564
Eolt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro
А вопрос-то вообще в чем?
Числа с плавающей запятой не сравнивают с помощью "=" и "<>" - в этом проблема? Ну так кури, как устроен Double


Он просто не понимает элементарных вещей в программировании. Это не первый подобный его топик.
...
Рейтинг: 0 / 0
Задачка
    #40058569
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXS
HandKot, а у вас в настройках Винды указана запятая в качестве десятичного? Бывает...

зная, что "бывает", из какого места надо доставать мозг, чтобы использовать несовместимые по языковым соглашениям преобразования?

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

И это, в части сравнений значений double - вообще говоря, даже исходный x сам с собой
на равенство/неравенство не вполне корректно сравнивать...
...
Рейтинг: 0 / 0
Задачка
    #40058570
Eolt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXS
Shocker.Pro
Числа с плавающей запятой не сравнивают с помощью "=" и "<>"
-- это утверждение мне кажется ложным.

Результаты вычислений (над числами с плавающей запятой) редко когда имеет смысл сравнивать с помощью "=" и "<>"

-- с этим соглашусь.


Вместо того чтобы создавать очередной бессмысленный топик, иногда лучше сначала заглянуть в гугл
...
Рейтинг: 0 / 0
Задачка
    #40058572
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby
в части сравнений значений double - вообще говоря, даже исходный x сам с собой
на равенство/неравенство не вполне корректно сравнивать...
да что вы говорите, глубокоуважаемый! Ну, не сравнивайте, если "не вполне корректно" -- вдруг он в самом деле окажется себе не равен!
...
Рейтинг: 0 / 0
Задачка
    #40058581
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: vbnet
1.
Abs(x1-x2) < точность

это сравнение для Double. Тут не с чем спорить
...
Рейтинг: 0 / 0
Задачка
    #40058584
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro, если вам нужно проверить, не изменялось ли значение переменной по ходу работы программы, то вы напишите
Код: vbnet
1.
Abs(x1-x2) < точность

?
...
Рейтинг: 0 / 0
Задачка
    #40058589
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXS
Shocker.Pro, если вам нужно проверить, не изменялось ли значение переменной по ходу работы программы, то вы напишите
Да, потому что у метода проверки есть единственная ответственность - сверить два значения. Изменялась она или получена посредством вычисления, для метода это совершенно неважно. Кури SOLID и прочие практики программирования. Ты, видимо, не работал в команде с большим количеством разработчиков, работающих над одним кодом. Твой вариант хрупок, его легко сломать при рефакторинге и масштабировании.
...
Рейтинг: 0 / 0
Задачка
    #40058592
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

если переменную "никто не трогал", то её значение точно будет равно исходному будь она String, Long или Double.

Если вы скажете, что вы свой код пишете так, что вам принципиально никогда не может понадобиться это свойство переменных ... я пойму.
...
Рейтинг: 0 / 0
Задачка
    #40058597
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXS
если переменную "никто не трогал"
переменную "никто не трогать" обычно может только в пределах метода. Еще раз, если сейчас у тебя проверка и изменение переменной идет в одном методе, то это абсолютно не значит, что после рефакторинга приложени это не окажется в разных методах. И твой коллега не должен думать о том, что он может сломать код, если просто вынесет часть его в другой метод.

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

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

я и не сравниваю. Но и вопросов не задаю.
Вот вопрос к вам.
Вы пишите:
Код: vbnet
1.
2.
3.
4.
Dim x As Double, x1 As Double, x2 As Double
Let x = Sqr(2#)

Let x1 = Val(CStr(x))


на каком основании вы ожидаете в x1 то же самое двоичное представление значения, полученного другим вычислением?

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




Иван FXSесли переменную "никто не трогал", то её значение точно будет равно исходному будь она String, Long или Double.
Понятие сравнения на равенство хорошо определено только для типов данных, для которых возможно точное представление значения.
К double это не относится, поэтому на равенство их сравнивать не рекомендуется ( как и на прямое неравенство).
Хотя соответствующие операции формально и определены.
...
Рейтинг: 0 / 0
Задачка
    #40058604
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXS
Shocker.Pro,

то есть -- забыли про Double -- вообще никогда никакие переменные не следует проверять на "никто не трогал"?
Не забыли про Double, потому что в топике речь идет про плавающую запятую.
Целые числа можно сравнивать с предсказуемым результатом.

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

Код: vbnet
1.
2.
3.
Dim x As Double, x1 As Double, x2 As Double
Let x = Sqr(2#)
Let x1 = Sqr(2#)

правильно ли я вас понял, что вы не уверены даже в том, как отработает код
Код: vbnet
1.
if 2# = 2# then Stop


?
...
Рейтинг: 0 / 0
Задачка
    #40058612
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, уверенным быть нельзя. Для потребителя лишь известно, что некая функция возвращает определенный результат с определенной точностью. Так как результатом является число с плавающей запятой, к этому результату не стоит применять сравнение на эквивалентность.
...
Рейтинг: 0 / 0
Задачка
    #40058613
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro
если сейчас у тебя проверка и изменение переменной идет в одном методе, то это абсолютно не значит, что после рефакторинга приложени это не окажется в разных методах. И твой коллега не должен думать о том, что он может сломать код, если просто вынесет часть его в другой метод.
я просто это уже распечатал и на стенку повесил, чтобы выучить наизусть ... но потом осознал, что я ведь забуду довольно быстро, что этот пассаж -- из топика о Double...
...
Рейтинг: 0 / 0
Задачка
    #40058615
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXS
booby

Код: vbnet
1.
2.
3.
Dim x As Double, x1 As Double, x2 As Double
Let x = Sqr(2#)
Let x1 = Sqr(2#)

правильно ли я вас понял, что вы не уверены даже в том, как отработает код
Код: vbnet
1.
if 2# = 2# then Stop


?

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

вспомнил, кстати - есть в некоторых странах люди, которые счетчики времени в ракетах пво строят на double (ЗРК Patriot первого покления).
Это оказалось очень удобным.
Выяснилось, что спустя примерно 3 месяца боевого дежурства ракета летит на 180 градусов,
ровно в обратную сторону от намеченной.
Чтобы не переписывать софт, ввели регламент обнуления счетчика времени.
...
Рейтинг: 0 / 0
Задачка
    #40058693
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чем, собственно, работа кода
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Sub Example_double(x As Double)
Dim x_saved As Double
Let x_saved = x
Call some_proc_double(x)
If x <> x_saved Then MsgBox "x was changed"
End Sub

Sub some_proc_double(x As Double)
Let x = x + dxxx
End Sub

-- отличается от работы кода
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Sub Example_long(i As Long)
Dim i_saved As Long
Let i_saved = i
Call some_proc_long(i)
If i <> i_saved Then MsgBox "i was changed"
End Sub

Sub some_proc_long(i As Long)
Let i = i + diii
End Sub

?

Тем, что i обязательно поменяется в some_proc_long(), если diii<>0, а x может не поменяться в some_proc_double() -- не смотря на то, что dxxx<>0 ?
...
Рейтинг: 0 / 0
Задачка
    #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
Задачка
    #40059410
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eolt
Shocker.Pro
А вопрос-то вообще в чем?
Числа с плавающей запятой не сравнивают с помощью "=" и "<>" - в этом проблема? Ну так кури, как устроен Double


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

(например, во входном потоке обрабатываемых числовых значений некоторые являются нулевыми)

-- и вы, господа, видимо, не позволите себе ни само это значение сравнить с нулём:
Код: vbnet
1.
If x_maybe_zero <> 0# then ...

ни произведение сравнить с нулём:
Код: vbnet
1.
If x_maybe_zero*y = 0# then ...
...
Рейтинг: 0 / 0
Задачка
    #40059479
Eolt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXS,

Не надоело еще воду в ступе толочь? Или это такой троллинг тупостью?

авторкогда по логике решаемой задачи один из сомножителей вычисляемого произведения обращается в ноль, то есть вот просто в чистейший ноль типа Double
Тебе уже объяснили, нет никакого "чистого ноля" в двоичном формате с плавающей точкой. Есть только приблизительные значения в входящие в определенный диапазон.
Если это трудно тебе дается, то попробуй почитать хотя бы здесь: https://floating-point-gui.de/basic/

автор-- и вы, господа, видимо, не позволите себе ни само это значение сравнить с нулём:
If x_maybe_zero <> 0# then ...
ни произведение сравнить с нулём:
If x_maybe_zero*y = 0# then ...

Этот код полная чушь. Нельзя так применять операции сравнения к числам с плавающей точкой.
Сравнение возможно только в пределах определенного допуска, как описано здесь: https://floating-point-gui.de/errors/comparison/
В .NET например есть специальный метод для сравнения двух значений Double, работает так:

Код: c#
1.
2.
3.
4.
5.
// Initialize two doubles with apparently identical values
double double1 = .33333;
double double2 = (double) 1/3;
// Compare them for equality
Console.WriteLine(double1.Equals(double2));    // displays false



Для VB/VBA нет встроенного метода на подобие Equals, но есть всякие самописные реализации:
Код: 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.
81.
82.
' Compares two numbers to see if they meet the comparison condition
' within the specified tolerance.
' Valid comparison operators are, "=" "<", ">", "<=", and ">=".
Public Function NumbersCompare(Value1 As Double, Value2 As Double, _
           operator As String, _
           Optional Tolerance As Double = 0.000000000001) As Boolean
    Dim difference As Double
    difference = Abs(Value1 - Value2)
   
    Dim comparison As String
    comparison = ""
    Dim equals As Boolean
    equals = False
    If Len(operator) = 2 Then
        ' Determine if the operator is greater or less than.
        If Mid(operator, 1, 1) = ">" Then
            comparison = ">"
        ElseIf Mid(operator, 1, 1) = "<" Then
            comparison = "<"
        Else
            MsgBox "Bad comparison operator: " & operator
            NumbersCompare = False
            Exit Function
        End If
       
        ' Determine if equals to is specified.
        If Mid(operator, 2, 1) = "=" Then
            equals = True
        Else
            MsgBox "Bad comparison operator: " & operator
            NumbersCompare = False
            Exit Function
        End If
    ElseIf Len(operator) = 1 Then
        ' Determine if the operator is greater than,
        ' less than, or equals to.
        If operator = ">" Then
            comparison = ">"
        ElseIf operator = "<" Then
            comparison = "<"
        ElseIf operator = "=" Then
            equals = True
        Else
            MsgBox "Bad comparison operator: " & operator
            NumbersCompare = False
            Exit Function
        End If
    Else
        MsgBox "Bad comparison operator: " & comparison
        NumbersCompare = False
        Exit Function
    End If
   
    ' Do the actual comparisons.
    If operator = ">" Then
        ' Check if the value is greater than, using the tolerance.
        If Value1 + Tolerance > Value2 Then
            NumbersCompare = True
            Exit Function
        Else
            NumbersCompare = False
        End If
    ElseIf operator = "<" Then
        ' Check if the value is less than, using the tolerance.
        If Value1 - Tolerance < Value2 Then
            NumbersCompare = True
            Exit Function
        Else
            NumbersCompare = False
        End If
    End If

    ' Check if the numbers are equal, within the tolerance.
    If equals Then
        If difference <= Tolerance Then
            NumbersCompare = True
            Exit Function
        Else
            NumbersCompare = False
        End If
    End If
End Function




Соответственно сравнение чисел с плавающей точкой реализуется так:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Public Sub CompareNumbers3()
    Dim val1 As Double
    val1 = 0.1 + 0.1 + 0.1

    Dim val2 As Double
    val2 = 0.3

    Debug.Print "val1 = " & CStr(val1) & ", val2 = " & CStr(val2)

    If NumbersCompare(val1, val2, "<=") Then
        Debug.Print "Values compare"
    Else
        Debug.Print "Values do not compare"
    End If
End Sub




P.S. Просьба к модераторам закрыть этот бредовый топик.
...
Рейтинг: 0 / 0
Задачка
    #40059486
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eolt
нет никакого "чистого ноля" в двоичном формате с плавающей точкой. Есть только приблизительные значения в входящие в определенный диапазон
отлил в граните -- это апофеоз начетничества!

Озвучьте, в какой именно " определенный диапазон входит приблизительное значение " 0# ? Он же "определенный" -- ну так объявите его!
...
Рейтинг: 0 / 0
Задачка
    #40059489
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eolt
троллинг тупостью
хорошее определение для топика

Иван FXS
Озвучьте, в какой именно " определенный диапазон входит приблизительное значение " 0# ? Он же "определенный" -- ну так объявите его!
Выше тебе уже все разжевали с кучей ссылок, но ты опять бьешься головой об стену в попытке найти для себя какое-то оправдание, приводя вырожденные примеры.

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


Даже вы с ними имеете дело каждый день
Смотрите:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
Type TB
  a(0 To 7) As Byte
End Type
Type TD
 d As Double
End Type

Sub test_zero()
  Dim p_zero As TB, m_zero As TB
  Dim d1 As TD, d2 As TD
  m_zero.a(7) = 128
  LSet d1 = p_zero
  LSet d2 = m_zero
  '
  Debug.Print d1.d, d2.d, d1.d = d2.d, d1.d = -0#, d2.d = 0#
  Dim m_zero2 As TB
  LSet m_zero2 = d2
  Debug.Print m_zero2.a(7)
  
End Sub



В реализации системного, машинного double именно два нуля и есть.
То, что в VB обвязка над системным double, "упрощает" работу с базовым типом и заметает под ковер его некоторые особенности, это правда.
Но технически, число нулей в двоичном представлении от этого не меняется.
...
Рейтинг: 0 / 0
Задачка
    #40059504
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXS
я правильно вас понял, вы можете представить такие "системы"-- или даже имели с ними дело? -- в которых 0# был реализован не как " все биты нулевые "?
мне не нужно представлять детали инкапсулированных реализаций чего-либо в каких бы то ни было системах, как существующих, так и перспективных, я работаю на прикладном уровне с черным ящиком, для которого представлены методики работы с ним. В этом суть инкапсуляции. Это неважно, double это или сложный класс внешней библиотеки. Повторю, как индивидуальный разработчик ты можешь говнокодить как угодно, в команде за учитывание внутренней реализации какой-либо библиотеки, тебе прилетит по башке от аппрувера.
...
Рейтинг: 0 / 0
Задачка
    #40059506
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby, ну, точно:
Debug.Print d1.d = d2.d, d1.d = -0#, d2.d = 0#

ибо просто:
Код: vbnet
1.
Debug.Print  -0# = 0#


или чуть сложнее
Код: vbnet
1.
2.
Const minus_zero As Double = -0#
Debug.Print minus_zero = 0#


-- то есть значение минусНоль, конечно может возникнуть в результате вычислений (ака манипуляций), но в качестве числовой константы оно не существует. "-0#" -- компилируется как 0#.
...
Рейтинг: 0 / 0
Задачка
    #40059507
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro
с черным ящиком, для которого представлены методики работы с ним
-- где представлены? Можете дать ссылку на (или процитировать) нормативное описание языка VB , в котором (описании) явным образом сформулирована догма "сравнивать double-значение на равенство запрещено "?

Я вижу:docs.microsoft.comWhen you work with floating-point numbers (Single Data Type and Double Data Type), remember that they are stored as binary fractions. This means they cannot hold an exact representation of any quantity that is not a binary fraction (of the form k / (2 ^ n) where k and n are integers). For example, 0.5 (= 1/2) and 0.3125 (= 5/16) can be held as precise values , whereas 0.2 (= 1/5) and 0.3 (= 3/10) can be only approximations.

Because of this imprecision, you cannot rely on exact results when you operate on floating-point values. In particular, two values that are theoretically equal might have slightly different representations-- соответственно, если по логике задачи требуется узнать, содержит ли переменная некоторое конкретное binary-fraction-значение (включая, конечно, ноль, который тоже есть binary-fraction), то где запрет проверить это проверкой на равенство?
...
Рейтинг: 0 / 0
Задачка
    #40059510
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby, упсссссс, кстати, нет, беру свои слова обратно:
Код: vbnet
1.
2.
3.
4.
  Let d2.d = -0#
  Dim m_zero2 As TB
  LSet m_zero2 = d2
  Debug.Print m_zero2.a(7)

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

Иван FXS
booby, ну, точно:
... но в качестве числовой константы оно не существует. "-0#" -- компилируется как 0#.

Вообще конечно, трудно понять, на чем вы настаиваете, но давайте попробуем аккуратно перевести на русский язык существо дела.
В данном конкретном случае в сравнениях d1.d = d2.d и d2.d = 0# производятся сравнение двух несовпадающих двоичных
представлений значения. У них некоторые биты не совпадают .

А VB говорит, что эти двоично не совпадающие значения одинаковы .
Это прямо опровергает утверждение о том, что видя результат сравнения, вы можете быть уверены в идентичности/различности
двоичного содержимого сравниваемых значений. В данном случае - это в обоих случаях не так.
-----------------------
Это я к тому говорю, что если вы для инженерных вычислений double используете, то будете и значения сравнивать с учетом ожидаемой относительной погрешности.
(Это трудное дело. Хорошо делать это почти никто не умеет. Здесь я себя, например, подразумеваю, в качестве "почти никто")

А вам, double, по вероятности, нужен для онтологических исследований в области хранения меток времени в формате double.
Простой совет для такого случая - подберите другой формат хранения.
Иначе ваши ожидания о том, что может быть, а чего не может - могут жестоким образом обмануться, даже если вам кажется, что вы обладаете хорошей моделью происходящего .
---------------------------
Стандарт, кстати, уже трижды официально менялся.
Последняя версия вышла в 2019 году.
Там были переосмыслены и отменены/заменены некоторые нововведения 2008 года.
...
Рейтинг: 0 / 0
Задачка
    #40059516
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby
Существует ли такое двоичное представление нуля, в котором не все биты равны нулю
дословно (последний) вопрос был не про "двоичное представление нуля", а про константу 0#, но я уже признал, что существование значения "минусНоль" не только как явления в потоке вычислений, но и как константы -0# (побитово отличной от константы 0#) -- это занимательно.
...
Рейтинг: 0 / 0
Задачка
    #40059525
Eolt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXS
Можете дать ссылку на (или процитировать) нормативное описание языка VB , в котором (описании) явным образом сформулирована догма "сравнивать double-значение на равенство запрещено "?


MSDN читать не пробовал? Для особо одаренных отметил стрелочкой нужное место.
...
Рейтинг: 0 / 0
Задачка
    #40059543
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eolt, а вы по-английски совсем не читаете? Я эту цитату выложил здесь сегодня в 11:11 --
Иван FXS
Я вижу:docs.microsoft.comWhen you work with floating-point numbers (Single Data Type and Double Data Type), remember that they are stored as binary fractions. This means they cannot hold an exact representation of any quantity that is not a binary fraction (of the form k / (2 ^ n) where k and n are integers). For example, 0.5 (= 1/2) and 0.3125 (= 5/16) can be held as precise values , whereas 0.2 (= 1/5) and 0.3 (= 3/10) can be only approximations.

Because of this imprecision, you cannot rely on exact results when you operate on floating-point values. In particular, two values that are theoretically equal might have slightly different representations
и даже жирным выделил " might have " и другие существенные словосочетания.

Кстати, "могут иметь несколько различных представлений" -- это очень не слишком качественный перевод оригинального (надеюсь, вы не сомневаетесь, что оригинальным является английский вариант?) "might have slightly different representations"...

Ещё раз повторю, хотя уже начинает надоедать: если переменная типа Double инициирована нулевым значением ( =0# ), то её значение будет оставаться в точности таким, пока не будет изменено на что-то отличное от 0#.

И даже более того: если переменой присвоено некоторое Double-значение (читайте внимательно, по буквам: D_o_u_b_l_e_з_н_а_ч_е_н_и_е, а не "теоретически равное", то её значение и будет оставаться в точности именно этим Double-значением, пока не будет изменено на что-то отличное от этого Double-значения.

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


Код: vbnet
1.
2.
3.
4.
5.
6.
7.
   Dim val1 As Double
   val1 = 0.1 + 0.1 + 0.1

   Dim val2 As Double
   val2 = 0.3
    
   If val1 = val2 Then MsgBox "Равно"



И не пишет: "Остановись идиот! Ты стреляешь себе в ногу!".
Тут дело в том, что в 90-ые когда создавался Classic VB такое поведение средств разработки было нормой.
Было достаточно, что преподаватель объяснял студентам, что нельзя проверять числа с плавающей точкой на равенство.
Они понимали это и больше так не делали.

Сейчас конечно ситуация другая, PVS Studio например такому коду просто не даст скомпилироваться .
...
Рейтинг: 0 / 0
Задачка
    #40059546
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXS
...
И даже более того: если переменой присвоено некоторое Double-значение (читайте внимательно, по буквам: D_o_u_b_l_e_з_н_а_ч_е_н_и_е, а не "теоретически равное", то её значение и будет оставаться в точности именно этим Double-значением, пока не будет изменено на что-то отличное от этого Double-значения.
...

даже может так и быть, при условии, что значение "достаточно далеко от нуля", программа не собрана линкером от gcc времен начала
90х годов, и программа не запущена на процессоре Intel 80486
...
Рейтинг: 0 / 0
Задачка
    #40059548
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXS
Ещё раз повторю, хотя уже начинает надоедать: если переменная типа Double инициирована нулевым значением ( =0# ), то её значение будет оставаться в точности таким, пока не будет изменено на что-то отличное от 0#.

И даже более того: если переменой присвоено некоторое Double-значение (читайте внимательно, по буквам: D_o_u_b_l_e_з_н_а_ч_е_н_и_е, а не "теоретически равное", то её значение и будет оставаться в точности именно этим Double-значением, пока не будет изменено на что-то отличное от этого Double-значения.


Даже если это так, какой смысл в этом знании?
Повторю: Что нам даст знание о том, изменялась переменная или нет?

Будем ли мы считать переменную изменённой, если над ней произведены манипуляции
Код: vbnet
1.
2.
let x = x + 2
let x = x - 2

?
Если да - то как это определить по значению переменной? (выше я уже говорил про флаги, по значению такие вещи не определяют)
Если нет , то как ты собираешься использовать "=" или "<>" для проверки?
...
Рейтинг: 0 / 0
Задачка
    #40059551
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

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

Код: vbnet
1.
упсссссссссссс
...
Рейтинг: 0 / 0
Задачка
    #40059553
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXS
если мы подозреваем, что некоторая процедура "производит манипуляции" с интересующей нас переменной
Такая постановка задачи настолько идиотская, что даже обсуждать ее нет смысла.


Ты не ответил на заданный вопрос. Видимо потому, что хорошо понимаешь последствия.
Иван FXS
Кстати, запустите в качестве развлечения
Код: vbnet
1.
If (0.3 + 2#) - 2# = 0.3 Then Stop

Кстати, запусти в качестве развлечения
Код: vbnet
1.
If (0.3 + 1.23E120) - 1.23E120 Then Stop

а потом нам расскажешь про отслеживание манипуляций с интересующей переменной
...
Рейтинг: 0 / 0
Задачка
    #40059554
Eolt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Господа может хватит кормить этого тролля? Топик лучше закрыть, а его забанить за бессмысленный флуд.
...
Рейтинг: 0 / 0
Задачка
    #40059555
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXS
Код: vbnet
1.
упсссссссссссс

внезапно осознал и стер глупость? Увы, она осталась в моей цитате
...
Рейтинг: 0 / 0
Задачка
    #40059556
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eolt
Господа может хватит кормить этого тролля? Топик лучше закрыть, а его забанить за бессмысленный флуд.
ну ты же сам присоединился к кормлению, значит у тебя тоже было немножко хлебушка. Топик забавный, даже кто-то поблагодарил за продуктивную дискуссию. Впоследствии можно к нему отсылать, если у кого-то возникнут вопросы по сравнению double
...
Рейтинг: 0 / 0
Задачка
    #40059557
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro
внезапно осознал и стер
да, понял, что в спешке неправильно проинтерпретировал происходящее на экране.
Shocker.Pro
Увы, она осталась в моей цитате
на здоровье, рад, что доставил вам положительную эмоцию.

(ну вот вы же в ответ написали в спешке нелепый пример
Код: vbnet
1.
If (0.3 + 1.23E+120) - 1.23E+120 Then Stop

и что мне теперь, ухохотаться?
...
Рейтинг: 0 / 0
Задачка
    #40059558
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Отличный пример, дополняющий твой.

Так что
Код: vbnet
1.
2.
let x = x + 2
let x = x - 2

считается манипуляцией или нет?
...
Рейтинг: 0 / 0
Задачка
    #40059559
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro
Ты не ответил на заданный вопрос
могу только повторить: самопроизвольно никакие значения переменных не могут меняться -- от слова совсем. Если вам это свойство переменных кажется бесполезным ... или если вы не понимаете саму конструкцию "самопроизвольно меняться" ... ну, имеете право.
...
Рейтинг: 0 / 0
Задачка
    #40059561
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXS
самопроизвольно никакие значения переменных не могут меняться
спасибо, Кэп
...
Рейтинг: 0 / 0
Задачка
    #40071548
user-77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Eolt,

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


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