#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
バグの説明
下のソースコードのように
-0.1F
をテストするとエラーが発生し、NaNと評価された再現手順
期待した動作
NaNではなく0.1になる
環境
その他
なし