Sqrt от "отрицательного нуля", как лучше обработать?

Хрена-се вы парни навертели с получением -0 пока я хоккей смотрел! А делов-то, просто знать сраную константу FLT_MIN (ну, или не помнить (как я не помню), но знать, что такая есть, тогда её нетрудно найти, что я сейчас и сделал).

Многие знания — многие печали.

esp32#>var -0.0
% “-0.0” is a number, which can be written as:
% C-style cast of a memory content:
% unsigned : 2147483648
% signed : -2147483648
% float : -0.000000
% Same number in different bases:
% Hex : 0x80000000
% Octal : 020000000000
% Binary : 0b10000000000000000000000000000000

Твой минус ноль равен 0x80000000
Проверяй старший бит.

я предполагал ее существование. Но не нашел - у меня давно ощущение, что либо интернет уже не тот, либо я разучился правильно составлять поисковые запросы :man_shrugging:

очень годно! Благодарю!

Ради интереса проверил сейчас на windows (Cygwin): sqrt(-0.0f) == -0.0f :slight_smile:
gcc v 11.3.0

Он писал, что у него значения и вовсе не могут быть отрицательными.
Тогда можно просто принудительно гасить самый старший бит.

Будет эффективно, но крайне некрасиво, из-за преобразования типов и манипуляциями с битами во float

что-то вроде (UPDATE: код внизу - бред, он не работает :). надо исправлять)

float __attribute__((const, always_inline)) SQRT(float value) {

  return sqrt(   (float )((uint32_t )value &~ 0x80000000)   );
}

Скорее всего добавится одна или две машинные инструкции. На i386 добавляется две.

Такие вещи лучше делать через стандартные библиотеки. Вот, например, Вы в своём примере забиваетесь на одинарную точность, а в 8-битных авр используется половинная, там Ваша константа не прокатит. В стандартной библиотеке среды будет собсвтенно тоже самое, но именно так, как надо. А если делать “самогон”, то такие вещи тоже нужно отрабатывать (ну, если код не “гарантированно только для одной платформы”).

Забавно! Не знал.