davedelong / DDMathParser

String → Number
MIT License
854 stars 153 forks source link

sin(pi) != 0 #164

Open Roman-Kerimov opened 5 years ago

Roman-Kerimov commented 5 years ago

This can be fixed so:

extension Double {
    func isDivisible(by value: Double) -> Bool {
        let decimalNumberFormatter = NumberFormatter.init()
        decimalNumberFormatter.numberStyle = .decimal
        return decimalNumberFormatter.string(from: .init(value: self/value))?.contains(decimalNumberFormatter.decimalSeparator) == false
    }
}

func sin(_ value: Double) -> Double {
    return value.isDivisible(by: .pi) ? 0 : Foundation.sin(value)
}

func cos(_ value: Double) -> Double {
    return (.pi/2+value).isDivisible(by: .pi) ? 0 : Foundation.cos(value)
}

func tan(_ value: Double) -> Double {
    return value.isDivisible(by: .pi) ? 0 : (.pi/2+value).isDivisible(by: .pi) ? .infinity : Foundation.tan(value)
}
p-i- commented 5 years ago

@Roman-Kerimov Was this you? If so, please get in touch if you're interested in involving in a project. I can't find your contact details anywhere. My apologies to the repository maintainer for an off-topic comment.

Roman-Kerimov commented 5 years ago

@p-i- Yes it's me. I added mail to my profile.

aheze commented 8 months ago

@Roman-Kerimov how safe is this approach? It works fine in my testing but using NumberFormatter for this seems sketchy.