История изменений
Исправление LINUX-ORG-RU, (текущая версия) :
Можно пушкой по воробушкам, явно приводить знаковый бит нуля, но не трогать остальное.
В смысле не трогать любые другие отрицательные числа, если они вдруг будут.
#include <stdio.h>
#include <stdint.h>
float force_positive_only_zero(float f)
{
union { float f; uint32_t i; }v = { f = f };
v.i = ((v.i << 1) >> 1);
if (v.i == 0) /* но не уверен тут может быть подвох? Вроде не должно*/
{
return v.f;
}
return f;
}
int main()
{
float right=-2.0f, left=2.0f;
float res = (right+left)/(right-left);
res = force_positive_only_zero(res);
printf("%5.12e \n", res);
float test = -0.00000000000000424f;
printf("%3.3f\n", test);
}
Исправление LINUX-ORG-RU, :
Можно пушкой по воробушкам, явно приводить знаковый бит нуля, но не трогать остальное. В смысле не трогать любые другие отрицательные числа, если они вдруг будут.
#include <stdio.h>
#include <stdint.h>
float force_positive_only_zero(float f)
{
union { float f; uint32_t i; }v = { f = f };
v.i = ((v.i << 1) >> 1);
if (v.i == 0) /* но не уверен тут может быть подвох? Вроде не должно*/
{
return v.f;
}
return f;
}
int main()
{
float right=-2.0f, left=2.0f;
float res = (right+left)/(right-left);
res = force_positive_only_zero(res);
printf("%5.12e \n", res);
float test = -0.00000000000000424f;
printf("%3.3f\n", test);
}
Исходная версия LINUX-ORG-RU, :
Можно пушкой по воробушкам, явно приводить знаковый бит нуля, но не трогать остальное.
#include <stdio.h>
#include <stdint.h>
float force_positive_only_zero(float f)
{
union { float f; uint32_t i; }v = { f = f };
v.i = ((v.i << 1) >> 1);
if (v.i == 0)
{
return v.f;
}
return f;
}
int main()
{
float right=-2.0f, left=2.0f;
float res = (right+left)/(right-left);
res = force_positive_only_zero(res);
printf("%5.12e \n", res);
float test = -0.00000000000000424f;
printf("%3.3f\n", test);
}