CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

Problème mathématique

Shiba_the_Inu
Shiba_the_Inu
Niveau 85
22 février 2025 à 11:33:17

Coucou, étant nul en math j'ai un petit soucis car je n'arrive pas à finir mon raisonnement...
Le but c'est de créer un compteur qui aura quelques fonctions (intervalle limité ou non, boucle ou non dans l'intervalle etc) et également aura certaines valeurs notamment :
départ (positif ou négatif)
limite (positif ou négatif)
valeurActuelle (positif ou négatif mais dans restreint dans l'intervalle [ depart ; limite ]

il s'incrémentera automatiquement, mais je voudrais aussi pouvoir ajouter une valeur manuellement (positive ou négative elle aussi) mais qui restera contenu dans l'intervalle
[ départ ; limite ]
un exemple :
départ = 1
limite = 5
valeurActuelle = 2
valeurAjoutée = 7

la valeurActuelle sera plus de 2 mais 4 :
valeurActuelle = 2 on ajoute 7 qui bouclera dans l'intervalle :
3 ->4 -> 5 ==> on arrive à la limite donc on reprend depuis "départ" : 1 -> 2 -> 3 -> 4
sur des valeurs positive pas de soucis, mais dès que y'a des valeurs négatives (départ/limite/valeur ajoutées) ça se corse...

Je calcule d'abord la valeur de l'intervalle avec la fonction
intervalle = math.abs(limite - départ) +1
intervalle = 5
ensuite pour rester sur un intervalle je sais qu'il faut l'opération modulo :
résultat = (valeurActuelle + valeurAjoutées) % intervalle
résultat = 4

mais ensuite je bloque, parce que si il y a des valeurs négative, ça ne colle plus. J'ai essayé différent truc, mais ça marche plus suivant que la limite ou le départ soient inversé (incrémentation négative par exemple) et/ou si la valeurAjoutée est négative ou positive... Est-ce que je dois jouer aussi avec des math.min/math.max par rapport à départ/limite et resultat ?
C'est plutôt pour du Lua, mais sinon il existe un moyen plus simple contenir des valeurs dans un intervalle ?

Je sèche un peu... je ne cherche pas forcément du code pure, mais de la logique / pseudo code s'il vous plaît https://image.noelshack.com/fichiers/2017/21/1495923662-fghhh.png

Shiba_the_Inu
Shiba_the_Inu
Niveau 85
22 février 2025 à 12:09:46

Bon, je reviens déjà, mais il semblerai que math.abs ne marche pas de la même manière entre js et lua... j'avais voulu montrer le code sur un autre topic mais en js... sauf qu'en js j'ai eu le résultat que je voulais... :

var valeur = -5
var départ = -5
var limite = 3
var actuelle = 2
var intervalle = Math.abs(limite - départ) +1
var résultat = (actuelle + valeur ) %intervalle

console.log("intervalle : " + intervalle) // output : 9
console.log("résultat : " + résultat) // output : -3

en lua :

local valeur = -5
local depart = -5
local limite = 3
local actuelle = 2
local intervalle = math.abs(limite - depart)+1
local resultat = (actuelle + valeur) % intervalle

print("intervalle : " .. intervalle) --output : 9
print("resultat : ".. resultat) -- output : 6

:doute:

Message édité le 22 février 2025 à 12:13:17 par Shiba_the_Inu
Shiba_the_Inu
Shiba_the_Inu
Niveau 85
22 février 2025 à 13:57:57

Bon, après moulte recherches sur le net j'ai compris déjà une chose :
en lua % c'est pas vraiment le modulo (et C non plus si j'ai bien compris), en tout cas ça ne marche pas de la même manière car ça ne gère pas les nombres négatifs, du coup j'ai du utiliser la fonction math.fmod()

Ça n'a aps marché pour autant avec une nouvelle valeur positive sur des itnervalle négatifs... j'ai donc pour la première fois de ma vie utilisé chat gpt pour voir, en précisant que je voulais math.abs et math.fmod, déjà du mal à savoir formuler ça :peur: , mais il a compris et m'a fourni le code suivant :

-- Fonction qui ajoute la valeur à la valeur actuelle tout en restant dans l'intervalle [départ, limite]
function ajouterDansIntervalle(valeurActuelle, depart, limite, nouvelleValeur)
-- Calcul de l'intervalle (absolu)
local intervalle = math.abs(limite - depart) +1

-- On utilise math.fmod pour ajouter nouvelleValeur et rester dans l'intervalle
local valeurResultat = math.fmod(valeurActuelle + nouvelleValeur - depart, intervalle)

-- Si le résultat est négatif, on le ramène dans l'intervalle positif
if valeurResultat < 0 then
valeurResultat = valeurResultat + intervalle
end

-- On ajuste pour que la valeur se situe bien dans l'intervalle [depart, limite]
return depart + valeurResultat
end

-- Exemple d'utilisation
local depart = -5
local limite = -2
local valeurActuelle = -3
local nouvelleValeur = -5

local resultat = ajouterDansIntervalle(valeurActuelle, depart, limite, nouvelleValeur)
print("Résultat final : " .. resultat)

j'ai juste du rajouter +1 au calcul de la variable intervalle, j'ai fait quelques essais avec différents nombres positifs/négatifs, ça semble marcher.
Je vais transposer ça à mon objet maintenant, ça ne devrait pas être compliqué.

Je laisse la réponse là des fois que quelqu'un ait le même problème un jour https://image.noelshack.com/fichiers/2022/38/5/1663914975-patiente.png

N'hésitez pas cependant si mathématiquement vous pensez que ce n'est pas tout à fait ça, ça a marché pour mes quelques tests mais il y a peut-être des exceptions... :peur:

godrik
godrik
Niveau 30
22 février 2025 à 20:04:57

oui modulo est specifie de facon potentiellement inattendu sur les negatif.

Attend de recontrer le cas ou abs(x) est negatif ;)

Shiba_the_Inu
Shiba_the_Inu
Niveau 85
23 février 2025 à 11:06:44

Ah... :peur:
C'est quelque chose de commun à tous les langages ?

godrik
godrik
Niveau 30
23 février 2025 à 18:24:24

Oui!
C'est un probleme de representation des entiers
Sur 8-bit tu representes les entiers de -128 a +127.
Donc si tu calcul abs(-128) ca devrait te donner +128. Mais c'est pas representatble et dans l'arithmetique modulaire, c'est le meme nombre que -128, qui lui est representable.

Ahah!
La premiere fois que j'ai rencontre ca dans la nature, j'ai mis du temps a comprendre ce qu'il m'arrivait!

Shiba_the_Inu
Shiba_the_Inu
Niveau 85
23 février 2025 à 20:31:30

Ah, merci pour l'explication, effectivement vu comme ça, ça parait logique si j'ose dire, mais ça doit être pénible dans certains cas...

Message édité le 23 février 2025 à 20:31:57 par Shiba_the_Inu
Sous forums
  • Aide à l'achat Mac
  • Steam Deck
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Macintosh
  • Hardware
La vidéo du moment