[#92070] [Ruby trunk Feature#15667] Introduce malloc_trim(0) in full gc cycles — sam.saffron@...
Issue #15667 has been updated by sam.saffron (Sam Saffron).
3 messages
2019/04/01
[ruby-core:92479] [Ruby trunk Feature#15811] Propsing new method for comparing equality of 2 (float) numbers relatively
From:
wishdev@...
Date:
2019-04-29 14:55:32 UTC
List:
ruby-core #92479
Issue #15811 has been updated by wishdev (John Higgins).
The tests for this are incorrect and show why this does not work.
From the test gist
context 'Numbers between 1 and 0' do
let (:absolute_tolerance) { 1.0E-14 }
it 'returns true for same positive numbers' do
expect(Math.close?(1000001.0E-15, 1000002.0E-15, abs_tol: absolute_tolerance)).to be_truthy
expect(Math.close?(1000002.0E-15, 1000001.0E-15, abs_tol: absolute_tolerance)).to be_truthy
end
it 'returns true for same negative numbers' do
expect(Math.close?(-1000001.0E-15, -1000002.0E-15, abs_tol: absolute_tolerance)).to be_truthy
expect(Math.close?(-1000002.0E-15, -1000001.0E-15, abs_tol: absolute_tolerance)).to be_truthy
end
it 'returns false for different positive numbers' do
expect(Math.close?(1000010.0E-15, 1000020.0E-15, abs_tol: absolute_tolerance)).to be_falsey
expect(Math.close?(1000020.0E-15, 1000010.0E-15, abs_tol: absolute_tolerance)).to be_falsey
end
it 'returns false for different negative numbers' do
expect(Math.close?(-1000010.0E-15, -1000020.0E-15, abs_tol: absolute_tolerance)).to be_falsey
expect(Math.close?(-1000020.0E-15, -1000010.0E-15, abs_tol: absolute_tolerance)).to be_falsey
end
end
10E-15 == 1E-14 therefore since the absolute tolerance is equal to the difference of the bottom two "return false" specs - they must be true - they are not true because subtracting those floats ends up with garbage.
For example
1000020.0E-15 - 1000010.0E-15
equals
1.0000000000085785e-14
Which places it outside of 1E14 but common sense (and looking at the numbers in front of us) obviously the correct answer is 1E14.
Floating numbers cannot be acted upon and then the result used to prove something.
This does not provide what it claims to provide - it is not possible to provide what you wish to provide here when dealing with floats.
Sorry
John
----------------------------------------
Feature #15811: Propsing new method for comparing equality of 2 (float) numbers relatively
https://bugs.ruby-lang.org/issues/15811#change-77825
* Author: yennguyenh (yen nguyen)
* Status: Open
* Priority: Normal
* Assignee:
* Target version:
----------------------------------------
#Background
Equal comparison method between 2 float numbers returns unexpected results sometimes. Therefore, a relative comparison method is needed!
#Proposal
A relative equal comparison method has been written based on a Python project! This method gives the approximation for the equal comparison based on two values: realative tolerance and absolute tolerance. Near zero value will also be considered carefully!
#Implementation
The function for that would be called close?
close?(a, b, rel_tol, abs_tol)
a and b: are the two values to be tested to relative closeness
rel_tol: is the relative tolerance -- it is the amount of error allowed, relative to the larger absolute value of a or b. For example, to set a tolerance of 5%, pass tol=0.05. The default tolerance is 1E-9, which assures that the two values are the same within about 9 decimal digits. rel_tol must be greater than 0.0
abs_tol: is a minimum absolute tolerance level -- useful for comparisons near zero.
#Evaluation of your implementation
By default, relative tolerance is 1E-9 which is relatively precise enough to compare two float numbers. However it can also be adjusted in case higher accuracy is requested. The absolute tolerance is by default 0.0 and need to be set in case of near-zero numbers.
#Discussion
There are some test cases available for the method which has approved the accuracy of the method. BigNumbers and integers are also tested. However, more test cases are still needed to assure even better the accuracy of the method.
#Gist
Relative equal comparison
https://gist.github.com/yennguyenh/63d5e7a11f354f796b43ada037c4b2c5
Test cases
https://gist.github.com/yennguyenh/2e81dc72b310cb9d886a82faf3d536ef
--
https://bugs.ruby-lang.org/
Unsubscribe: <mailto:ruby-core-request@ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>