diff --git a/src/bfloat16.jl b/src/bfloat16.jl index c2a3ec4..79ef956 100644 --- a/src/bfloat16.jl +++ b/src/bfloat16.jl @@ -362,6 +362,13 @@ function Base.show(io::IO, x::BFloat16) end Printf.tofloat(x::BFloat16) = Float32(x) +# Parsing +Base.parse(::Type{BFloat16}, s::AbstractString) = BFloat16(parse(Float32, s)) +function Base.tryparse(::Type{BFloat16}, s::AbstractString) + r = tryparse(Float32, s) + return isnothing(r) ? nothing : BFloat16(r) +end + # Random import Random: rand, randn, randexp, AbstractRNG, Sampler diff --git a/test/runtests.jl b/test/runtests.jl index 0696ce7..d1b9974 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -146,6 +146,31 @@ end @test repr(BFloat16(2)) == "BFloat16(2.0)" end +@testset "parse" for _parse in (parse, tryparse) + @test _parse(BFloat16, "Inf") === BFloat16(Inf) + @test _parse(BFloat16, "-Inf") === BFloat16(-Inf) + nan16 = _parse(BFloat16, "NaN") + @test isnan(nan16) + @test isa(nan16, BFloat16) + @test _parse(BFloat16, "2") === BFloat16(2) + @test _parse(BFloat16, "1.3") === BFloat16(1.3) + @test _parse(BFloat16, "+234.6") === BFloat16(234.6) + @test _parse(BFloat16, " +234.7") === BFloat16(234.7) + @test _parse(BFloat16, " -234.8") === BFloat16(-234.8) + @test _parse(BFloat16, " -234.90") === BFloat16(-234.9) + @test _parse(BFloat16, " 235.10 ") === BFloat16(235.1) + @test _parse(BFloat16, "000235.20 ") === BFloat16(235.2) + @test _parse(BFloat16, "4e+03") === BFloat16(4e3) + @test _parse(BFloat16, "5.e+04") === BFloat16(5e4) + @test _parse(BFloat16, "0x1.3cp+0") === BFloat16(1.234375) + @test _parse(BFloat16, "0X1.3CP+0") === BFloat16(1.234375) +end + +@testset "not parseable" for str in ("635.3X", "X635.4", "ABCDE", "1e0e0") + @test tryparse(BFloat16, str) === nothing + @test_throws ArgumentError parse(BFloat16, str) +end + @testset "random" begin x = Array{BFloat16}(undef, 10) y = Array{BFloat16}(undef, 10)