Если операторы не рассматриваются как логические?

Я студент, и мой учитель программного обеспечения привел нам этот пример -

BEGIN
IF first < second
    THEN display first,second
ELSE
    display second,first
ENDIF
END

Если бы два числа, первое и второе были одинаковыми (скажем, 2,2), был бы выбран путь ELSE, так как first ‹second оценивается как false и поэтому не выполняется.

Однако мой учитель программного обеспечения сказал, что на некоторых языках совпадение обоих чисел будет проблематичным и вызовет ошибки или странное поведение (я полагаю, он привел в качестве примера Visual Basic). Я не понимаю, как это возможно. Оператор IF оценивается либо как истинный, либо как ложный, поэтому одна из опций ДОЛЖНА выполняться, и не должно возникнуть проблем с оценкой того, меньше ли 2, чем 2.

Хотя он мой учитель, и я уважаю его как такового, я не полностью ему доверяю, и он иногда допускает ошибки. Правильно ли то, что он сказал? И если да, могу ли я привести конкретные примеры того, что происходит? Спасибо.


person GoatsWearHats    schedule 04.05.2016    source источник
comment
покажите ему пример на VB или другом языке, к которому легко получить доступ, например, javascript   -  person dan-man    schedule 04.05.2016
comment
Я не припомню, чтобы слышал о языке, где ELSE не гарантировалось, если IF было ложным. Даже Visual Basic. Думаю, было бы неплохо попросить у него примера. :)   -  person Allan S. Hansen    schedule 04.05.2016
comment
Есть ли шанс, что он упомянул оценку короткого замыкания? Visual Basic не делает этого по умолчанию, и это может быть довольно неожиданным, если исходить из языков C-стиля.   -  person Anton Gogolev    schedule 04.05.2016
comment
Ааа, возможно. Не могли бы вы немного рассказать об этом? @AntonGogolev   -  person GoatsWearHats    schedule 04.05.2016
comment
См. stackoverflow.com/q/486722/60188   -  person Anton Gogolev    schedule 04.05.2016


Ответы (3)


Возможно, он говорит (в некоторой степени) о неточности чисел с плавающей запятой?

не должно возникнуть проблем с оценкой того, меньше ли 2, чем 2.

Это не всегда так для некоторых чисел, хранящихся с использованием неточного представления, например:

Dim first As Double, second As Double

 first = 0.3
second = 0.1 + 0.2

If first < second Then
    Debug.Print first, "is less than", second
Else
    Debug.Print "equal or greater"
End If

Выходы:

0.3 is less than 0.3

См. Не работает ли математика с плавающей запятой?

Это может проявиться более наглядно, когда кто-то превысит безопасные границы типа с плавающей запятой, например, в JavaScript:

> 9007199254740992 == 9007199254740993
< true
person Alex K.    schedule 04.05.2016

Очевидно, что a ‹a ложно, если a целое (не дробное число). Однако в случае дробного числа это может быть истина или ложь. Позвольте мне привести вам экземпляр каждого для языка c. Компилятор C использует представление чисел IEEE-754 для чисел с плавающей запятой.

возьмите a = 0,1273 (хранится в памяти как: 0,1272999423027039)

возьмем b = 0,12 и c = 0,0073 + b

Теперь, если вы проверите, c Это правда.

person Henish shah    schedule 06.05.2016

person    schedule
comment
Ладно, я не думал, что это обычное дело. Спасибо. - person GoatsWearHats; 04.05.2016