Skip to content

Commit c944c26

Browse files
fixed a logic issue when comparing HugeFloats
1 parent 37de2e4 commit c944c26

File tree

3 files changed

+78
-7
lines changed

3 files changed

+78
-7
lines changed

Sources/huge-numbers/HugeFloat.swift

Lines changed: 66 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ public struct HugeFloat : Hashable, Comparable, Codable {
165165

166166
/// Whether or not this huge float equals zero.
167167
public var is_zero : Bool {
168-
return integer.is_zero && remainder == nil && (decimal == nil || decimal!.value.is_zero)
168+
return integer.is_zero && (remainder == nil || remainder!.is_zero) && (decimal == nil || decimal!.value.is_zero)
169169
}
170170

171171
/// Optimized version of multiplication when multiplying by 10. Using this function also respects the decimal and remainder.
@@ -236,7 +236,7 @@ public struct HugeFloat : Hashable, Comparable, Codable {
236236
public func to_radians() -> HugeFloat {
237237
return self * HugeFloat("0.01745329252")
238238
}
239-
public func to_degrees(precision: HugeInt = HugeInt.default_precision) -> HugeFloat { // TODO: support trig arithemtic
239+
public func to_degrees(precision: HugeInt = HugeInt.default_precision) -> HugeFloat { // TODO: support trig arithmetic
240240
return self * (180 / HugeFloat.pi_100)
241241
}
242242
}
@@ -261,14 +261,70 @@ public extension HugeFloat {
261261
public extension HugeFloat {
262262
static func < (left: HugeFloat, right: HugeFloat) -> Bool {
263263
guard left.is_negative == right.is_negative else {
264-
return left.is_negative && !right.is_negative
264+
return left.is_negative
265265
}
266-
let left_pre_decimal_number:HugeInt = left.integer, right_pre_decimal_number:HugeInt = right.integer
267-
return left_pre_decimal_number < right_pre_decimal_number || left_pre_decimal_number == right_pre_decimal_number && (left.decimal?.is_less_than(right.decimal) ?? left.remainder?.is_less_than(right.remainder) ?? true)
266+
let left_integer:HugeInt = left.integer, right_integer:HugeInt = right.integer
267+
guard left_integer == right_integer else {
268+
return left_integer < right_integer
269+
}
270+
if left.decimal != nil || right.decimal != nil {
271+
return (left.decimal ?? HugeDecimal.zero).is_less_than(right.decimal)
272+
} else if left.remainder != nil || right.remainder != nil {
273+
return (left.remainder ?? HugeRemainder.zero).is_less_than(right.remainder)
274+
}
275+
return false
276+
}
277+
static func <= (left: HugeFloat, right: HugeFloat) -> Bool {
278+
guard left.is_negative == right.is_negative else {
279+
return left.is_negative
280+
}
281+
let left_integer:HugeInt = left.integer, right_integer:HugeInt = right.integer
282+
guard left_integer == right_integer else {
283+
return left_integer <= right_integer
284+
}
285+
if left.decimal != nil || right.decimal != nil {
286+
return (left.decimal ?? HugeDecimal.zero).is_less_than_or_equal_to(right.decimal)
287+
} else if left.remainder != nil || right.remainder != nil {
288+
return (left.remainder ?? HugeRemainder.zero).is_less_than_or_equal_to(right.remainder)
289+
}
290+
return true
291+
}
292+
}
293+
public extension HugeFloat {
294+
static func > (left: HugeFloat, right: HugeFloat) -> Bool {
295+
guard left.is_negative == right.is_negative else {
296+
return !left.is_negative
297+
}
298+
let left_integer:HugeInt = left.integer, right_integer:HugeInt = right.integer
299+
guard left_integer == right_integer else {
300+
return left_integer > right_integer
301+
}
302+
if left.decimal != nil || right.decimal != nil {
303+
return (left.decimal ?? HugeDecimal.zero).is_greater_than(right.decimal)
304+
} else if left.remainder != nil || right.remainder != nil {
305+
return (left.remainder ?? HugeRemainder.zero).is_greater_than(right.remainder)
306+
}
307+
return false
308+
}
309+
310+
static func >= (left: HugeFloat, right: HugeFloat) -> Bool {
311+
guard left.is_negative == right.is_negative else {
312+
return !left.is_negative
313+
}
314+
let left_integer:HugeInt = left.integer, right_integer:HugeInt = right.integer
315+
guard left_integer == right_integer else {
316+
return left_integer >= right_integer
317+
}
318+
if left.decimal != nil || right.decimal != nil {
319+
return (left.decimal ?? HugeDecimal.zero).is_greater_than_or_equal_to(right.decimal)
320+
} else if left.remainder != nil || right.remainder != nil {
321+
return (left.remainder ?? HugeRemainder.zero).is_greater_than_or_equal_to(right.remainder)
322+
}
323+
return true
268324
}
269325
}
270326
/*
271-
prefixes
327+
prefixes / postfixes
272328
*/
273329
public extension HugeFloat {
274330
static prefix func - (value: HugeFloat) -> HugeFloat {
@@ -511,6 +567,10 @@ public extension HugeFloat {
511567
static func / (left: any FloatingPoint, right: HugeFloat) -> HugeFloat {
512568
return HugeFloat(left) / right
513569
}
570+
571+
static func /= (left: inout HugeFloat, right: HugeFloat) {
572+
left = left / right
573+
}
514574
}
515575
internal extension HugeFloat {
516576
static func divide(left: HugeFloat, right: HugeFloat, precision: HugeInt) -> HugeFloat {

Sources/huge-numbers/HugeRemainder.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ public struct HugeRemainder : Hashable, Comparable {
3131
}
3232

3333
public var is_zero : Bool {
34-
return dividend == HugeInt.zero
34+
return dividend.is_zero
3535
}
3636
public var to_int : (quotient: HugeInt, remainder: HugeRemainder?) {
3737
return dividend / divisor

Tests/huge-numbersTests/huge_numbersTests.swift

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -465,6 +465,17 @@ extension huge_numbersTests {
465465
XCTAssert(float.description.elementsEqual("-3"), "test_float;float=\(float);float.description=" + float.description)
466466
XCTAssert(float.description_simplified.elementsEqual("-3"), "test_float;float=\(float);float.description_simplified=" + float.description_simplified)
467467

468+
let five:HugeFloat = HugeFloat("5")
469+
XCTAssert(!(five < five))
470+
XCTAssert(!(five < -five))
471+
XCTAssert(-five < five)
472+
473+
XCTAssert(five <= five)
474+
XCTAssert(five >= five)
475+
XCTAssert(-five <= five)
476+
XCTAssert(!(-five >= five))
477+
XCTAssert(five >= -five)
478+
468479
test_float_addition()
469480
test_float_subtraction()
470481
test_float_multiplication()

0 commit comments

Comments
 (0)