Вопрос

Я просто столкнулся с этой линией кода:

if( lineDirection.length2() ){...}

куда length2 Возвращает А. double. Отказ Это головоломки меня, что 0.0 эквивалентно 0, NULL, и / или false.

Является ли эта часть стандарта C ++ или не определена поведение?

Это было полезно?

Решение

Это очень много стандартного поведения (логическое преобразование)

$ 4.12 / 1 - «RValue of Arithmetic, перечисление, указатель или указатель к типу элемента может быть преобразован в rvalue of type bool. Нулевое значение, значение нулевого указателя или значение указателя нуля или значение для нулевого элемента, преобразуется в false; любое другое значение преобразуется в True. "

Другие советы

Стоит отметить, что этот код чрезвычайно ломкий для представления с плавающей точкой. Этот код будет работать, если и только если значение с плавающей точкой является ровно 0, что на самом деле довольно вряд ли в большинстве случаев. Это может быть не в этом конкретном случае, но он, безусловно, должен быть задокументирован / прокомментировать, если так.

Практически все остальные ситуации, которые вам нужно решить "Эпсилонское значение" Это определяет диапазон чисел плавающих точек, которые вы считаете «одинаковым» - в противном случае ваши сравнения, которые очень могут удивить вас в углу (и часто не очень угольных) случаев.

Да - сравнение против нуля (0,0) и возвращает false, если результат точно нулевой, и истина иначе.

Поведение унаследовано от C, которое лечит эквивалентное сравнение так же.

Когда вы сравниваете без операторов, вы сравниваете «против true», чтобы любой тип переменного имени проверяется либо логическими (простой случай), либо другой. Числовые типы переменной имеют ложное значение, определенное как «0», «0,0» или около того, поэтому, когда вы сравниваете их «против True», ваше сравнение вернет ложь.

Если длина2 возвращает 0,0, это будет сделано как false. Но вы можете удивительно привести к этому сравнению. Лучше использовать значение EPSILON, так как MadkeithV предложил во время сравнения плавающей точки.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top