11521 sujets

JavaScript, DOM et API Web HTML5

Bonjour, pour commencer JavaScript, j'ai décidé de réaliser une calculatrice. En voulant calculer les racines (impaires) de nombres négatifs, j'ai remarqué que mon programme ne donné pas le bon résultat. Par exemple, lorsque je calcule la racine cubique de -25, je reçois le résultat "NaN". Et c'est le cas, peu importe la racine (impaire) ou le nombre négatif. Comment puis-je régler ce problème ?

Voici la partie correspondante de mon programme :
function racine(x) {
    if (x%2 == 0 && total < 0) {
        console.log("Erreur")
    } else {
        total = total**(1/x)
        return total
    }
}


Merci d'avance pour votre aide.
Modifié par Yuuno (21 Jul 2021 - 19:33)
Modérateur
Salut,

C'est une volonté de ne pas passer par Math.sqrt() ?

Et qu'est-ce que "total" ?
De ce que j'ai compris Math.sqrt() permet uniquement de faire des racines carrées. De mon coté je veux également faire des racines cubiques, quatrième... Pour le total, c'est une valeur que je défini dans la consol ou le résultat d'un calcul ultérieur. Si tu veux, voici mon programme complet :
(() => {
    console.log("Ceci est une calculatrice, voici les commandes à dicposition :")
    console.log("   - addition(x)")
    console.log("   - soustraction(x)")
    console.log("   - multiplication(x)")
    console.log("   - division(x)")
})()

let total = 0

function addition(x) {
    total += x
    return total
}

function soustraction(x) {
    total -= x
    return total
}

function multiplication(x) {
    total *= x
    return total
}

function division(x) {
    if (x == 0) {
        console.log("Erreur")
    } else {
        total /= x
        return total
    }
}

function puissance(x) {
    total **= x
    return total
}

function puissanceCarre() {
    total **= 2
    return total
}

function racine(x) {
    if (x%2 == 0 && total < 0) {
        console.log("Erreur")
    } else {
        total = total**(1/x)
        return total
    }
}

function racineCarre() {
    if (total < 0) {
        console.log("Erreur")
    } else {
        return Math.sqrt(total)
    } 
}

Modifié par Yuuno (21 Jul 2021 - 20:33)
Bonsoir,

a priori, ce n'est pas possible avec la fonction "puissance". Sur MDN on a :

// Utilisation simple
Math.pow(7, 2); // 49

// Exposants négatifs
Math.pow(7, -2); // 0.02040816326530612 (1/49)

// Exposants fractionnaires
Math.pow(2, 1/2); // 1.4142135623730951 (racine carrée de 2)

// Cas aux limites
Math.pow(-7, 0.5); // NaN
// (les nombres négatifs n'ont pas de racine carrée)
Math.pow(-7, 1/3); // NaN
// Nombre négatif avec une base décimale


En revanche, pour la racine cubique (cubic root) il existe une fonction dédiée :

console.log(Math.cbrt(-8));  // donne 2


  https://developer.mozilla.org/fr/docs/orphaned/Web/JavaScript/Reference/Global_Objects/Math/cbrt  
... petite precision :

le fonction 'power' ne fonctionne pas (pour la racine cubique) avec les nbres negatifs mais fonctionne très bien avec les positifs :


console.log(Math.pow(8, 1/3))  // donne 2
console.log(Math.pow(16, 1/4)) // donne 2 
console.log(Math.pow(32, 1/5)) // donne 2 

Modifié par alain_47 (22 Jul 2021 - 00:31)
Merci pour l'aide, mais le problème avec les fonctions dédiée aux racines au carrées ou cubiques, c'est qu'elles sont trop limité. Dans le cas d'une racine quatrième ou autre, ma calculatrice devient inutilisable.
Modérateur
Ah oui donc racine(3) en fait c'est la racine cubique de total. Bon ducoup faut déjà avoir un total quoi.

Bon du coup si je fais :

let total = -25;

function racine(x) {
    if (x%2 == 0 && total < 0) {
        console.log("Erreur");
    } else {
        total = total**(1/x);
        return total;
    }
}

console.log(racine(3));

Dans la console je vois bien le NaN.

Bah il doit pas kiffer une puissance 1/x avec un nombre négatif... tu peux le faire sur le positif et rajouter le - après... Smiley sweatdrop
Modifié par _laurent (22 Jul 2021 - 01:38)
Meilleure solution
C'est du bricolage poussé à l'extrême, mais c'est pas con du tout ! De toute façon avec mes connaissances actuelles, je ne pense pas trouver un meilleure solution. Encore merci pour votre aide.
Modifié par Yuuno (22 Jul 2021 - 03:41)
Attention quand même, car le JS n'est pas réputé pour etre très précis en mathematique.

Exemple :


function cubic_root(x){
   let result = x<0 ? -Math.pow(-x, 1/3) : Math.pow(x, 1/3);
   return result;
}

console.log(cubic_root(8));     // 2
console.log(cubic_root(512));  // 7.999999999999999 au lieu de 8
console.log(cubic_root(-8));   // -2
console.log(cubic_root(-512)); // -7.999999999999999 au lieu de -8


alors que ca fonctionne bien en PHP :

<?php

function cubicRoot($x){
    $result = $x<0 ? -pow(-$x, 1/3) : pow($x, 1/3);
    return $result;
}
 
echo cubicRoot(8).'<br>';    // 2
echo cubicRoot(512).'<br>';  // 8
echo cubicRoot(-8).'<br>';   // -2
echo cubicRoot(-512);        // -8

Modifié par alain_47 (24 Jul 2021 - 17:24)