pow()

Bonjour, si j'en crois la documentation d'Apple, la fonction swift pow() n'accepte qu'un entier pour le chiffre indiquant la puissance:
func pow(_ x: Decimal, _ y: Int) -> Decimal

Que faire pour élever un nombre avance une puissance décimale? Par exemple 5^3,5

Dans les faits, on peut mettre un double (le compilo ne bronche pas) mais pas un type decimal

Réponses

  • devulderdevulder Membre
    octobre 2021 modifié #2

    Hello,
    T'as plus qu'adapter le source code
    Exemple ici en c++ trouvé sur le net
    `include
    using namespace std;
    class gfg
    {

    /* Function to calculate x raised to the power y */
    public:
    int power(int x, unsigned int y)
    {
    if (y == 0)
    return 1;
    else if (y % 2 == 0)
    return power(x, y / 2) * power(x, y / 2);
    else
    return x * power(x, y / 2) * power(x, y / 2);
    }
    };

    /* Driver code */
    int main()
    {
    gfg g;
    int x = 2;
    unsigned int y = 3;

    cout << g.power(x, y);
    return 0;
    

    }
    `

  • Non @devulder, une fonction récursive n'est pas la solution. La récursion est à réserver au cas désespérés 😉

    Voilà ce que j'aurai tendance à utiliser :

    @inlinable public func pow<F: BinaryFloatingPoint>(_ lhs: Decimal, _ rhs: F, roundingMode: NSDecimalNumber.RoundingMode = .plain, maximumDecimalDigits maxDigits: Int = 12) -> Decimal {
        let n = CGFloat((lhs as NSDecimalNumber).doubleValue)
        let p = CGFloat(rhs)
    
        let result = Decimal(pow(n, p).native)
        var roundedResult = Decimal.zero
    
        withUnsafePointer(to: result) { NSDecimalRound(&roundedResult, $0, maxDigits, roundingMode) }
    
        return roundedResult
    }
    
  • @Pyroh Que signifie ".native" ?

  • @Rocou a dit :
    @Pyroh Que signifie ".native" ?

    native sur un CGFloat est une propriété de type CGFloat.NativeType. Sur les plateformes 32bits ça correspond à Float, sur les plateformes 64bits ça correspond alors à Double. Sans pour autant en être sûr, je crois qu'il n'y a plus que certaines versions de watchOS sont encore 32bits.

    Pour faire plus simple,

    let result = Decimal(pow(n, p).native)
    

    correspond à

    let result = Decimal(Double(pow(n, p)))
    
Connectez-vous ou Inscrivez-vous pour répondre.