yutotnh / spirit

モータードライバ用ライブラリ
https://yutotnh.github.io/spirit/
MIT License
2 stars 2 forks source link

Bug: bfloat16が負の数の時にNaNになる #247

Closed yutotnh closed 1 year ago

yutotnh commented 1 year ago

バグの説明

下のソースコードのように -0.1Fをテストするとエラーが発生し、NaNと評価された

#include <gtest/gtest.h>

#include <cmath>

#include "bfloat16.h"

TEST(BFloat16, BFloat16ToFloat32AndFloat32ToBFloat16)
{
    auto test = [](const float value) {
        uint16_t bfloat16 = spirit::float32_to_bfloat16(value);

        float result = spirit::bfloat16_to_float32(bfloat16);
        if (std::isnan(value)) {
            EXPECT_TRUE(std::isnan(result));
        } else if (std::isinf(value)) {
            EXPECT_TRUE(std::isinf(result));
        } else {
            // bfloat16は仮数部が7bitなので、float32に変換したときに誤差が出る
            // そのため、数値が許容範囲内かどうかをチェックする
            float allowable_error_margin = value / 127.0F;
            EXPECT_NEAR(result, value, allowable_error_margin) << "bfloat16: " << result << ", value: " << value;
        }
    };

    test(-0.1F);
}
17: The difference between result and value is nan, which exceeds allowable_error_margin, where
17: result evaluates to nan,
17: value evaluates to -0.10000000149011612, and
17: allowable_error_margin evaluates to -0.00078740157186985016.
17: bfloat16: nan, value: -0.10000000149011612

再現手順

  1. ...
  2. ...

期待した動作

NaNではなく0.1になる

環境

その他

なし