che cosa è l'uso di strictfp non modificatore di accesso?
Domanda
So che questo è un duplicato domanda.ma io voglio sapere con un esempio.così qualcuno può spiegare con un esempio?
Link per duplicare i post: Quando devo usare il "strictfp" parola chiave, in java?
Soluzione
Beh, girinie risposta riassume bene ma, se siete alla ricerca di un esempio ..
Diciamo che hai fatto un gioco che permette di highscore contributi, ma solo dopo che il server convalida il punteggio.Un metodo per convalidare il punteggio è di avere il client invia i tasti premuti (e i loro timestamp) al server.Idealmente, il server di gioco attraverso il stesso esatto gioco e di ottenere lo stesso punteggio.
Ora, supponiamo che il tuo gioco ha un po ' di fisica che può alterare l'esito del gioco (ad es.un'esplosione di lancio casuale di detriti che POTREBBE farti del male, se va a segno).
La fisica di gioco che potenzialmente potrebbe essere diverso sul server (anche se di poco) rispetto al client (ad esempio, se la conversione di numeri interi per il rilevamento di collisione, è stato arrotondato giù invece di fino).In un caso limite come questo, si può avere una situazione in cui il client di gioco è stato non colpito da detriti dell'esplosione, ma il server di gioco era - e ora abbiamo una differenza di punteggio, che potrebbe erroneamente invalidare un punteggio di presentazione
Mentre strictfp
certamente non è un proiettile d'argento, va un senso lungo nell'imporre una qualche consistenza di 'riproduzione' di istruzioni su diverse piattaforme.
Altri suggerimenti
Questo è ciò che il linguaggio Java spec dice:
In un'espressione FP-strict, tutto valori intermedi devono essere elementi del valore float impostare o doppio valore impostato, il che implica che i risultati di tutte le espressioni FP-severe devono essere quelli previsti da IEEE 754 aritmetico su operandi rappresentati impiegando singola e doppi formati. all'interno di un espressione che non è FP-strict, un po ' margine di manovra è concesso per un implementazione di utilizzare un prolungato gamma esponente a rappresentare risultati intermedi; l'effetto netto, grosso modo, è che un calcolo potrebbe produrre "il corretto risposta" in situazioni in cui esclusiva uso del valore impostato float o doppio valore impostato potrebbe causare overflow o underflow.
Ciò significa questo: aritmetica in virgola mobile (cioè calcoli che coinvolgono i tipi float
e double
) in Java è specificato alla aderiscono alla IEEE 754 standard, che dice esattamente come rappresentare i numeri FP. Il problema è che le CPU moderni usano internamente FP aritmetica che non aderiscono alla quella standard per i risultati intermedi - questo non è generalmente un problema, perché in realtà è più veloce e produce risultati più precisi. Ma potrebbe significare che un programma produce risultati leggermente diversi a seconda di quale hardware si gira su -, che è contro la promessa di base della piattaforma indipendenza di Java.
La parola chiave strictfp
consente di garantire che questa promessa è mantenuta e il programma avrà esattamente lo stesso risultato, non importa dove si corre - ma questo viene a costo di prestazioni inferiori su hardware in cui sforzo in più deve essere spesa per fare i calcoli FP aderiscono alla IEEE 754 su tutti i risultati intermedi.
La maggior parte del tempo, si sarebbe rahter avere prestazioni migliori, piuttosto che risultati identici garantiti tra le piattaforme, ed è per questo comportamento strictfp
è opzionale. In realtà è stato fatto Extra in Java 1.4, dopo implementatori JVM capito che avevano per rendere la CPU fare un lavoro extra per aderiscono alla spec quando la maggior parte del tempo come ad aderenza rigorosa avuto nessun vantaggio.
strictf sua molto speciale.
Vediamo con un Un esempio locale Agenzia .
Il codice scritto utilizza molto specifiche Numbers scientifici, ora questo numeri sono in decimali multi-posto .
Questi decimali valutano gli effetti della traiettoria del sentiero nave spaziale, che viene effettuata mediante le costanti quali attrito, gravità, calore, umidità, sole raggi ricevuto, elettricità generata, corpo gravitazionale multiplo , velocità, canna fumaria efficiente.
Il punto principale è che quando i dati sono di inviare per la valutazione di tenere traccia della nave, è dovrebbe restituire il valore che è uguale per piattaforma diversa altra cosa che riceverà i dati che è leggermente diverso in valore decimale.
Ma questo non è considerare come piccola differenza, come si comporterà la nave di deviare dalla sua traiettoria, Remember calcolo deferente, ogni piccolo puntino make traiettoria, così la nostra calcolo deve essere molto specifico e coerente anche per diverse piattaforma, deve avere standers e la precisione precis.
Per questa esigenza abbiamo strictf in Java.
Si desidera un programma volto a dimostrare che, la sua difficile mostrare questo preciso con un piccolo programma .