EricWF marked an inline comment as done.
EricWF added inline comments.

================
Comment at: include/math.h:1573
+  enum { _Bits = numeric_limits<_IntT>::digits - 
numeric_limits<_FloatT>::digits };
+  static const _IntT value = numeric_limits<_IntT>::max() >> _Bits << _Bits;
+};
----------------
scanon wrote:
> zoecarver wrote:
> > What's the reasoning behind shifting something forward and back? Shouldn't 
> > this always negate the other operation? 
> This function doesn't quite do what it says on the tin; it considers the 
> number of significand bits used for the floating-point type, but not the 
> exponent range. This doesn't matter for double, because double's exponent 
> range is much, much larger than any integer type, but it does matter for 
> types like float16 (largest representable value is 65504)--when it's added as 
> a standard floating-point type at some future point, this will introduce 
> subtle bugs.
> 
> You should be able to work around this by converting `value` to  `_FloatT`, 
> taking the minimum of the result and numeric_limits::max, and converting back.
> 
> This also assumes that _FloatT has radix == 2, which I do not believe is 
> actually implied by `is_floating_point == true`. Please add a static assert 
> for that so that future decimal types don't use this template.
Very good point. I've added the static assertions and limited the function to 
`float`, `double`, and `long double` so the `fp16` case won't bite us anytime 
soon.



CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D66836/new/

https://reviews.llvm.org/D66836



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to