LINUX.ORG.RU

История изменений

Исправление 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);
}