Хрена-се вы парни навертели с получением -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
Проверяй старший бит.
я предполагал ее существование. Но не нашел - у меня давно ощущение, что либо интернет уже не тот, либо я разучился правильно составлять поисковые запросы
очень годно! Благодарю!
Ради интереса проверил сейчас на windows (Cygwin): sqrt(-0.0f) == -0.0f
gcc v 11.3.0
Он писал, что у него значения и вовсе не могут быть отрицательными.
Тогда можно просто принудительно гасить самый старший бит.
Будет эффективно, но крайне некрасиво, из-за преобразования типов и манипуляциями с битами во float
что-то вроде (UPDATE: код внизу - бред, он не работает :). надо исправлять)
float __attribute__((const, always_inline)) SQRT(float value) {
return sqrt( (float )((uint32_t )value &~ 0x80000000) );
}
Скорее всего добавится одна или две машинные инструкции. На i386 добавляется две.
Такие вещи лучше делать через стандартные библиотеки. Вот, например, Вы в своём примере забиваетесь на одинарную точность, а в 8-битных авр используется половинная, там Ваша константа не прокатит. В стандартной библиотеке среды будет собсвтенно тоже самое, но именно так, как надо. А если делать “самогон”, то такие вещи тоже нужно отрабатывать (ну, если код не “гарантированно только для одной платформы”).
Забавно! Не знал.