-
-
Notifications
You must be signed in to change notification settings - Fork 5.5k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
round(::Type{<:AbstractFloat}, x, ::RoundingMode)
violates docstring
#52355
Comments
round(T, x, ::RoundingMode)
violates written semanticsround(::Type{<:AbstractFloat}, x, ::RoundingMode)
violates written semantics
round(::Type{<:AbstractFloat}, x, ::RoundingMode)
violates written semanticsround(::Type{<:AbstractFloat}, x, ::RoundingMode)
violates docstring
Should maybe have "correctness bug" label. |
@LilithHafner forgive the ping, but since the changes discussed here come from your PR and look to be landing in v1.11, I was hoping you could take a glance at this issue in case you have some commentary before a change would be breaking. |
Thanks for the ping! I didn't see this before. Option 1 would be disappointing. I'm going to look into performant options for 4. |
Option 2 is easy: julia> function exact_convert(::Type{T}, x) where T
t = convert(T, x)
t == x || throw(InexactError(:exact_convert, T, x))
t
end
exact_convert (generic function with 1 method)
julia> @b convert(Float32, $0xffff_ff00)
1.988 ns
julia> @b exact_convert(Float32, $0xffff_ff00)
2.263 ns
julia> exact_convert(Float32, 0xffff_ff00)
4.294967f9
julia> convert(Float32, 0xffff_ff00)
4.294967f9
julia> convert(Float32, 0xffff_ffff)
4.2949673f9
julia> exact_convert(Float32, 0xffff_ffff)
ERROR: InexactError: exact_convert(Float32, 0xffffffff)
Stacktrace:
[1] exact_convert(::Type{Float32}, x::UInt32)
@ Main ./REPL[27]:3
[2] top-level scope
@ REPL[33]:1 |
Option 4 is also not that hard. Performance of the naive approach is plenty fast on my computer, and only slows down the |
- fix #52355 using option 4 (round to nearest representable integer) - update docstrings *including documenting convert to Inf behavior even though Inf is not the "closest" floating point value* - add some assorted tests --------- Co-authored-by: mikmoore <95002244+mikmoore@users.noreply.github.com>
- fix #52355 using option 4 (round to nearest representable integer) - update docstrings *including documenting convert to Inf behavior even though Inf is not the "closest" floating point value* - add some assorted tests --------- Co-authored-by: mikmoore <95002244+mikmoore@users.noreply.github.com> (cherry picked from commit e7a1def)
- fix #52355 using option 4 (round to nearest representable integer) - update docstrings *including documenting convert to Inf behavior even though Inf is not the "closest" floating point value* - add some assorted tests --------- Co-authored-by: mikmoore <95002244+mikmoore@users.noreply.github.com> (cherry picked from commit e7a1def)
…g#54314) - fix JuliaLang#52355 using option 4 (round to nearest representable integer) - update docstrings *including documenting convert to Inf behavior even though Inf is not the "closest" floating point value* - add some assorted tests --------- Co-authored-by: mikmoore <95002244+mikmoore@users.noreply.github.com>
I don't have the development branch checked out right now, so forgive me for manually-interpreting this code and let me know if any of my concerns are due solely to my mistakes. This issue is in response to new functionality introduced in #50812, which has not been included in a release version (as of v1.9).
I take issue with the implementation
and the docstrings related to rounding functions. For example,
?floor
in #50812 states(note the minor typo "not representable a
T
", but that's not why I'm here)However, under the above implementation we have
floor(Float32, 0xffff_ffff) == 2f0^32 > 0xffff_ffff
. Thefloor(0xffff_ffff)
part is executed correctly (no-op because integer argument), but the subsequentconvert(Float32, 0xffff_ffff)
results in upward rounding and yields an invalid result (being larger than the input). By the current docstring, the result should be anInexactError
since0xffff_ffff
is not representable as aFloat32
. Alternatively, one might suggest that the largest not-greaterFloat32
be returned (in this caseprevfloat(2f0^32)
) but that would require a docstring change.Possible solutions include:
convert
is naively applied to the result offloor(x)
, so that this behavior is explainable under the stated semantics.InexactError
, as the written docstring indicates should happen.Type
argument from the rounding functions. Retain some special cases likeType{<:Integer}
(which already exist in release versions) where such issues cannot arise.floor(Float32, 0xffff_ffff)
is aMethodError
floor(T, x)
really that much better thanT(floor(x))
orconvert(T, floor(x))
? I'd be happy to have it except that it's wrong here. At least with the latter two the return value is explainable via the rounding behavior ofT
conversion.prevfloat(floor(T,x))
whenfloor(T,x) > x
andT<:AbstractFloat
, with similar changes to other rounding functions. Adjust the docstrings accordingly to accomodate this possibility. Something in the flavor of "return the largest integral-valuedT
that is less than or equal tox
".The text was updated successfully, but these errors were encountered: