|
Задачка
|
|||
---|---|---|---|
#18+
Eolt Shocker.Pro А вопрос-то вообще в чем? Числа с плавающей запятой не сравнивают с помощью "=" и "<>" - в этом проблема? Ну так кури, как устроен Double Он просто не понимает элементарных вещей в программировании. Это не первый подобный его топик. (например, во входном потоке обрабатываемых числовых значений некоторые являются нулевыми) -- и вы, господа, видимо, не позволите себе ни само это значение сравнить с нулём: Код: vbnet 1.
ни произведение сравнить с нулём: Код: vbnet 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
03.04.2021, 19:17 |
|
Задачка
|
|||
---|---|---|---|
#18+
Иван 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.
Для 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.
Соответственно сравнение чисел с плавающей точкой реализуется так: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
P.S. Просьба к модераторам закрыть этот бредовый топик. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2021, 00:59 |
|
Задачка
|
|||
---|---|---|---|
#18+
Eolt нет никакого "чистого ноля" в двоичном формате с плавающей точкой. Есть только приблизительные значения в входящие в определенный диапазон Озвучьте, в какой именно " определенный диапазон входит приблизительное значение " 0# ? Он же "определенный" -- ну так объявите его! ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2021, 01:30 |
|
Задачка
|
|||
---|---|---|---|
#18+
Eolt троллинг тупостью Иван FXS Озвучьте, в какой именно " определенный диапазон входит приблизительное значение " 0# ? Он же "определенный" -- ну так объявите его! Диапазон точности значения задает разрядность мантиссы, а диапазон точности вычислений и сравнений - потребитель. 0# является "чистым нулем" (все биты нулевые) только для конкретного способа реализации double в конкретной системе. Детали этой реализации в другой системе могут быть другими (и не будет там никакого "чистого нуля" в твоем понимании) и не должны волновать разраба. Поэтому работать с нулем особым образом, отличным от других значений, не имеет никакого смысла. А ты можешь делать как хочешь, я тебе это уже говорил. Инди-разработчик может оправдать для себя любой свой говнокод. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2021, 01:48 |
|
Задачка
|
|||
---|---|---|---|
#18+
Shocker.Pro 0# является "чистым нулем" (все биты нулевые) только для конкретного способа реализации double в конкретной системе. Детали этой реализации в другой системе могут быть другими (и не будет там никакого "чистого нуля" в твоем понимании) ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2021, 02:11 |
|
Задачка
|
|||
---|---|---|---|
#18+
Иван FXS Shocker.Pro 0# является "чистым нулем" (все биты нулевые) только для конкретного способа реализации double в конкретной системе. Детали этой реализации в другой системе могут быть другими (и не будет там никакого "чистого нуля" в твоем понимании) Даже вы с ними имеете дело каждый день Смотрите: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
В реализации системного, машинного double именно два нуля и есть. То, что в VB обвязка над системным double, "упрощает" работу с базовым типом и заметает под ковер его некоторые особенности, это правда. Но технически, число нулей в двоичном представлении от этого не меняется. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2021, 10:17 |
|
Задачка
|
|||
---|---|---|---|
#18+
Иван FXS я правильно вас понял, вы можете представить такие "системы"-- или даже имели с ними дело? -- в которых 0# был реализован не как " все биты нулевые "? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2021, 10:34 |
|
Задачка
|
|||
---|---|---|---|
#18+
booby, ну, точно: Debug.Print d1.d = d2.d, d1.d = -0#, d2.d = 0# ибо просто: Код: vbnet 1.
или чуть сложнее Код: vbnet 1. 2.
-- то есть значение минусНоль, конечно может возникнуть в результате вычислений (ака манипуляций), но в качестве числовой константы оно не существует. "-0#" -- компилируется как 0#. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2021, 10:56 |
|
Задачка
|
|||
---|---|---|---|
#18+
Shocker.Pro с черным ящиком, для которого представлены методики работы с ним Я вижу: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), то где запрет проверить это проверкой на равенство? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2021, 11:10 |
|
Задачка
|
|||
---|---|---|---|
#18+
booby, упсссссс, кстати, нет, беру свои слова обратно: Код: vbnet 1. 2. 3. 4.
-- то есть константа -0# имеет-таки выставленный бит знака! А равна нулю она оказывается именно при вычислении выражения (-0#=0#). Это любопытно! ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2021, 11:22 |
|
Задачка
|
|||
---|---|---|---|
#18+
Вопрос в чем был? Существует ли такое двоичное представление нуля, в котором не все биты равны нулю. Вам показано - вот, существует именно двоичное представление и именно нуля, в котором не все биты равны нулю. Иван FXS booby, ну, точно: ... но в качестве числовой константы оно не существует. "-0#" -- компилируется как 0#. Вообще конечно, трудно понять, на чем вы настаиваете, но давайте попробуем аккуратно перевести на русский язык существо дела. В данном конкретном случае в сравнениях d1.d = d2.d и d2.d = 0# производятся сравнение двух несовпадающих двоичных представлений значения. У них некоторые биты не совпадают . А VB говорит, что эти двоично не совпадающие значения одинаковы . Это прямо опровергает утверждение о том, что видя результат сравнения, вы можете быть уверены в идентичности/различности двоичного содержимого сравниваемых значений. В данном случае - это в обоих случаях не так. ----------------------- Это я к тому говорю, что если вы для инженерных вычислений double используете, то будете и значения сравнивать с учетом ожидаемой относительной погрешности. (Это трудное дело. Хорошо делать это почти никто не умеет. Здесь я себя, например, подразумеваю, в качестве "почти никто") А вам, double, по вероятности, нужен для онтологических исследований в области хранения меток времени в формате double. Простой совет для такого случая - подберите другой формат хранения. Иначе ваши ожидания о том, что может быть, а чего не может - могут жестоким образом обмануться, даже если вам кажется, что вы обладаете хорошей моделью происходящего . --------------------------- Стандарт, кстати, уже трижды официально менялся. Последняя версия вышла в 2019 году. Там были переосмыслены и отменены/заменены некоторые нововведения 2008 года. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2021, 11:31 |
|
Задачка
|
|||
---|---|---|---|
#18+
booby Существует ли такое двоичное представление нуля, в котором не все биты равны нулю ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2021, 11:51 |
|
Задачка
|
|||
---|---|---|---|
#18+
Иван FXS Можете дать ссылку на (или процитировать) нормативное описание языка VB , в котором (описании) явным образом сформулирована догма "сравнивать double-значение на равенство запрещено "? MSDN читать не пробовал? Для особо одаренных отметил стрелочкой нужное место. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2021, 13:05 |
|
Задачка
|
|||
---|---|---|---|
#18+
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 slightly different representations"... Ещё раз повторю, хотя уже начинает надоедать: если переменная типа Double инициирована нулевым значением ( =0# ), то её значение будет оставаться в точности таким, пока не будет изменено на что-то отличное от 0#. И даже более того: если переменой присвоено некоторое Double-значение (читайте внимательно, по буквам: D_o_u_b_l_e_з_н_а_ч_е_н_и_е, а не "теоретически равное", то её значение и будет оставаться в точности именно этим Double-значением, пока не будет изменено на что-то отличное от этого Double-значения. Возможно вы скажете, что вам в вашей практике вообще никогда не бывает нужно знать, изменилось ли значение той или иной переменной ... ну так это ж ваша практика, так что тут мне нечего возразить. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2021, 14:02 |
|
Задачка
|
|||
---|---|---|---|
#18+
Мне кажется я понял в чем причина упертости Иван FXS. Он видимо переживает, что компилятор позволяет ему скомпилировать этот код без ошибок и предупреждений Код: vbnet 1. 2. 3. 4. 5. 6. 7.
И не пишет: "Остановись идиот! Ты стреляешь себе в ногу!". Тут дело в том, что в 90-ые когда создавался Classic VB такое поведение средств разработки было нормой. Было достаточно, что преподаватель объяснял студентам, что нельзя проверять числа с плавающей точкой на равенство. Они понимали это и больше так не делали. Сейчас конечно ситуация другая, PVS Studio например такому коду просто не даст скомпилироваться . ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2021, 14:06 |
|
Задачка
|
|||
---|---|---|---|
#18+
Иван FXS ... И даже более того: если переменой присвоено некоторое Double-значение (читайте внимательно, по буквам: D_o_u_b_l_e_з_н_а_ч_е_н_и_е, а не "теоретически равное", то её значение и будет оставаться в точности именно этим Double-значением, пока не будет изменено на что-то отличное от этого Double-значения. ... даже может так и быть, при условии, что значение "достаточно далеко от нуля", программа не собрана линкером от gcc времен начала 90х годов, и программа не запущена на процессоре Intel 80486 ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2021, 14:11 |
|
Задачка
|
|||
---|---|---|---|
#18+
Иван FXS Ещё раз повторю, хотя уже начинает надоедать: если переменная типа Double инициирована нулевым значением ( =0# ), то её значение будет оставаться в точности таким, пока не будет изменено на что-то отличное от 0#. И даже более того: если переменой присвоено некоторое Double-значение (читайте внимательно, по буквам: D_o_u_b_l_e_з_н_а_ч_е_н_и_е, а не "теоретически равное", то её значение и будет оставаться в точности именно этим Double-значением, пока не будет изменено на что-то отличное от этого Double-значения. Даже если это так, какой смысл в этом знании? Повторю: Что нам даст знание о том, изменялась переменная или нет? Будем ли мы считать переменную изменённой, если над ней произведены манипуляции Код: vbnet 1. 2.
? Если да - то как это определить по значению переменной? (выше я уже говорил про флаги, по значению такие вещи не определяют) Если нет , то как ты собираешься использовать "=" или "<>" для проверки? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2021, 14:13 |
|
Задачка
|
|||
---|---|---|---|
#18+
Shocker.Pro, например, если мы подозреваем, что некоторая процедура "производит манипуляции" с интересующей нас переменной, то она может довольно долго "производить манипуляции", не меняя её значение, но это скорее экзотика, чем ожидаемое поведение. Код: vbnet 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2021, 14:24 |
|
Задачка
|
|||
---|---|---|---|
#18+
Иван FXS если мы подозреваем, что некоторая процедура "производит манипуляции" с интересующей нас переменной Ты не ответил на заданный вопрос. Видимо потому, что хорошо понимаешь последствия. Иван FXS Кстати, запустите в качестве развлечения Код: vbnet 1.
Код: vbnet 1.
а потом нам расскажешь про отслеживание манипуляций с интересующей переменной ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2021, 14:29 |
|
Задачка
|
|||
---|---|---|---|
#18+
Господа может хватит кормить этого тролля? Топик лучше закрыть, а его забанить за бессмысленный флуд. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2021, 14:31 |
|
Задачка
|
|||
---|---|---|---|
#18+
Иван FXS Код: vbnet 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2021, 14:31 |
|
Задачка
|
|||
---|---|---|---|
#18+
Eolt Господа может хватит кормить этого тролля? Топик лучше закрыть, а его забанить за бессмысленный флуд. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2021, 14:33 |
|
Задачка
|
|||
---|---|---|---|
#18+
Shocker.Pro внезапно осознал и стер Shocker.Pro Увы, она осталась в моей цитате (ну вот вы же в ответ написали в спешке нелепый пример Код: vbnet 1.
и что мне теперь, ухохотаться? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2021, 14:37 |
|
Задачка
|
|||
---|---|---|---|
#18+
Отличный пример, дополняющий твой. Так что Код: vbnet 1. 2.
считается манипуляцией или нет? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2021, 14:42 |
|
Задачка
|
|||
---|---|---|---|
#18+
Shocker.Pro Ты не ответил на заданный вопрос ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2021, 14:45 |
|
|
start [/forum/topic.php?fid=60&msg=40059525&tid=2154725]: |
0ms |
get settings: |
11ms |
get forum list: |
15ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
48ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
65ms |
get tp. blocked users: |
1ms |
others: | 270ms |
total: | 435ms |
0 / 0 |