Visualizzazione dei risultati da 1 a 10 su 14

Visualizzazione discussione

  1. #3
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Scusa ma ... il Nashorn non andava bene?

    Questo l'ho scritto velocemente:
    codice:
    import javax.script.Bindings;
    import javax.script.Compilable;
    import javax.script.CompiledScript;
    import javax.script.ScriptEngine;
    import javax.script.ScriptEngineManager;
    import javax.script.ScriptException;
    
    public class Prova {
        public static void main(String[] args) throws ScriptException {
            ScriptEngine engine = new ScriptEngineManager().getEngineByName("Nashorn");
    
            CompiledScript compiledExpr = ((Compilable) engine).compile("3*Math.pow(x, 2) - 15*x + 20");
            Bindings bindings = engine.createBindings();
    
            for (double x = 0; x <= 10; x += 0.1) {
                bindings.put("x", x);
                double result = (double) compiledExpr.eval(bindings);
                System.out.printf("x=%.5f --> %f%n", x, result);
            }
        }
    }

    Giusto alcune note:

    Compilable è una interfaccia che un ScriptEngine può opzionalmente implementare (non è obbligatorio). Il Nashorn la implementa. In questo modo si può "precompilare" l'espressione in modo che sia ri-eseguibile molto velocemente. Chiaramente il compile può fallire con ScriptException. Non l'ho gestita bene solo per brevità.

    Con il Bindings si possono "iniettare" valori nella espressione. Ho scritto una espressione matematica pensata a caso (equazione di 2° grado).

    Funziona sia con il Nashorn built-in del JDK che con quello messo come dipendenza esplicita (es. con Maven).



    Non l'ho letto tutto in dettaglio .... ma a me sembra scritto un po' maluccio (e fumoso). Sia stilisticamente, sia per cose non molto appropriate tipo if (numero!="")

    Per fare un parser di espressioni matematiche si dovrebbero applicare i concetti che portano alla creazione di un "albero" di nodi, come è descritto qui:

    https://www.openbookproject.net/book...ParseTree.html

    Quindi, in sostanza, se NON hai applicato un concetto del genere ...... hai totalmente sbagliato approccio.
    Ciao andbin, intanto grazie tante per le risposte, solo ora riesco a risponderti, si sicuramente ci deve essere un iterazione ricorsiva ad albero (nodi),
    per quanto riguarda le funzioni sopratutto(sin(sin(sin...)))), poi per il resto il fatto di usare il "replace" per le parentesi semplifica sicuramente il calcolatore, ma non so ben se è una strada stabile o se anche qui è richiesta una richiamata ricorsiva di altro genere. Per le operazioni le svolge se trova un operatore tra due numeri in sequenza nella stringa.
    Grazie del link lo vedrò al più presto.
    Purtroppo non sono ancora riuscito a caricare il nashorn da te postato, tento di nuovo ora, siccome mi premeva vedere i risultati, inoltre per diletto e passione mi sono un pochino dedicato a questo tipo di "risolutore", so bene che non è un buon motore ancora.

    Per:
    codice:
    if (numero!="")
    l'ho applicato perché il numero vien costruito come Stringa(Per poi ritornare un valore double, che però vien accettato solo se scritto nella forma: cifre.decimali , infatti potrebbe essere una lettera anche, di "sin" ad esempio.

    Tu come avresti fatto?
    codice:
    if (numero.length()>0)
    ?

    Ultima modifica di jabjoint; 20-09-2022 a 22:02
    jabjoint

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.