| Ticket UUID: | 85ce4bf928cd9a40064aa5b36e7033184dd5379a | |||
| Title: | [binary format R Inf] stores FLT_MAX | |||
| Type: | Bug | Version: | 8.6.3 | |
| Submitter: | anonymous | Created on: | 2015-02-02 08:21:54 | |
| Subsystem: | 48. Number Handling | Assigned To: | jan.nijtmans | |
| Priority: | 5 Medium | Severity: | Minor | |
| Status: | Closed | Last Modified: | 2022-11-10 13:56:50 | |
| Resolution: | Fixed | Closed By: | jan.nijtmans | |
| Closed on: | 2022-11-10 13:56:50 | |||
| Description: |
% binary scan [binary format R Inf] R x
% set x
3.4028234663852886e+38
This is FLT_MAX - see the bit pattern described near the bottom of http://wiki.tcl.tk/41088
The issue seems to be the test at http://core.tcl.tk/tcl/artifact/fee105a45aaf25a3?ln=1915-1917
By my reading, the condition should become:
if (!isinf(dvalue) && (fabs(dvalue) > (double)FLT_MAX))
In the chat, kbk adds:
If the float64 is less than FLT_MAX + 1/2 ulp, then it's not a 'true' overflow, and it should [binary format] to FLT_MAX. Greater than that, and it should be Inf.
Exact FLT_MAX + 1/2 ulp should round to FLT_MAX (round to even).
I have implemented a fix in http://chiselapp.com/user/aspect/repository/tcl/timeline?r=aspect-binary-float-inf
The first checkin http://chiselapp.com/user/aspect/repository/tcl/ci/f4d7334db9 corrects behaviour for Inf/-Inf only, and adds some tests.
Following checkins follow kbk's advice (I hope!) to correct out-of-range rounding behaviour, but with some questionable aspects:
* c99 reliance for INFINITY
* FLT_MAX+1/2ulp is calculated with an expression I don't entirely trust
* changes results (!!) of some existing tests which expect rounding to FLT_MAX
The included tests should be complete, but those in the 3rd checkin don't conform to conventions of their neighbours.
Another way to create FLT_MAX+1/2ulp for comparison would be as follows, though I can't vouch for its portability.
/* smallest double that should round to +Inf */
double flt_min_inf {} {
uint64_t bits = 0x47effffff0000001;
return *(double*)&bits;
}
/* largest double that should round to FLT_MAX */
double flt_max_dbl {} {
uint64_t bits = 0x47effffff0000000;
return *(double*)&bits;
}
Let me know if there's anything I can do to make this patch easier to consume.
| |||
| User Comments: |
jan.nijtmans added on 2022-11-10 13:56:50:
Fixed [48706a2425734695|here]. Since it depends on C99, the fix will not be in 8.6, but in 8.7 jan.nijtmans added on 2022-11-02 15:06:58: Rebased to core-8-branch: [20959e0da2451a45] aspect added on 2016-11-10 13:01:19: As another data point, the same is not true of doubles: % binary scan [binary format q Inf] q x 1 % set x Inf dkf added on 2015-05-15 22:17:16: Imported as branch bug-85ce4bf928 (see [21866fab39]) anonymous (claiming to be aspect) added on 2015-02-20 23:02:20: fossil bundle attached to this ticket. dgp added on 2015-02-04 18:18:08: The patch changes the expected result of existing tests in the test suite, so I'd prefer to have a review from kbk. dgp added on 2015-02-04 18:14:59: The patch changes the expected result of existing tests in the test suite, so I'd prefer to have a review from kbk. dgp added on 2015-02-04 18:10:28: The patch changes the expected result of existing tests in the test suite, so I'd prefer to have a review from kbk. dgp added on 2015-02-04 18:03:16: The patch changes the expected result of existing tests in the test suite, so I'd prefer to have a review from kbk. dgp added on 2015-02-04 15:43:29: The patch changes the expected result of existing tests in the test suite, so I'd prefer to have a review from kbk. dgp added on 2015-02-04 15:21:35: The patch changes the expected result of existing tests in the test suite, so I'd prefer to have a review from kbk. dgp added on 2015-02-04 15:15:50: The patch changes the expected result of existing tests in the test suite, so I'd prefer to have a review from kbk. dgp added on 2015-02-04 15:12:30: The patch changes the expected result of existing tests in the test suite, so I'd prefer to have a review from kbk. | |||
Attachments:
- aspect-binary-float-inf.fbun [download] added by anonymous on 2015-02-20 23:00:56. [details]