Ai fini dell'apprendimento, come devo impostare l'implementazione di una libreria di precisione arbitraria in C o C ++?

0

So che sto reinventando la ruota. Ma sono davvero interessato a implementare numeri di precisione arbitrari (interi, razionali, complessi, ecc.) In C o C ++ e i loro algoritmi . Per favore sii paziente.

My question: How should I approach the process of implementation (and testing) of arbitrary-precision numerical algorithms in C or C++? I don't want to dive right in without a strategy and ultimately see my project fail.

Apprezzerò i consigli sulle seguenti domande: su quale base fondare il mio codice? Che tipo di struttura dovrei provare ad applicare al progetto? Qualche altro consiglio generale per me?

Ecco alcune domande ovvie:

Perché C o C ++? Perché non attenersi a Java?

Voglio implementare le mie implementazioni il più velocemente possibile senza sacrificare troppa leggibilità. Ho intenzione di mantenere le cose modulari e manutenibili.

Volevo essere il più vicino possibile alla macchina, quindi ho intenzione di uscire dalla mia zona di comfort: Java e imparare C e / o C ++ per un cambiamento. Ho la maggior parte della sintassi giù, ora ho solo bisogno di prendere le migliori pratiche e convenzioni. Spero che questo progetto mi aiuti a imparare anche C e / o C ++.

Perché vuoi farlo? Ci sono molte librerie là fuori. Usali.

Questo non è davvero il mio obiettivo. Voglio acquisire esperienza nel campo dell'implementazione di algoritmi numerici. Mi diplomerò il liceo questo aprile e voglio diventare un ricercatore nel campo dell'informatica. Una delle cose che mi ha costantemente affascinato è l'enorme numero di algoritmi per eseguire le operazioni matematiche più elementari: l'aritmetica generale di base. Voglio entrare nei dettagli degli algoritmi. Sono disposto ad analizzare matematicamente le mie implementazioni perché posso e voglio farlo.

Non è la destinazione; è il viaggio che sto cercando.

Chi è l'utente finale del tuo progetto?

Chiunque voglia utilizzare una libreria di precisione arbitraria veloce, sicura e stabile (per qualsiasi scopo, dalla crittografia alla progettazione del linguaggio). Renderò il progetto open source, quindi altre persone (ricercatori, sviluppatori) possono fare riferimento alla mia implementazione. Non ho intenzione di ricavarne dei profitti (almeno direttamente).

Che cosa hai intenzione di fare dopo?

Costruirò il mio progetto, magari provando ad aggiungere il supporto multi-thread per varie operazioni. Probabilmente userò questo nella mia tesi (molta strada da fare prima)

Non penso che nessun altro sarà interessato a questo.

Va bene. Ci lavorerò da solo.

    
posta Hungry Blue Dev 26.03.2017 - 18:14
fonte

1 risposta

2

Basare il codice sulla libreria standard del C ++ e le solite convenzioni c ++.

Pensiero preliminare

Definisci l'interfaccia delle tue operazioni senza pensare all'implementazione. Ciò include le conversioni da e verso il tuo tipo (e le eccezioni di conversione se il tuo numero è troppo grande) e la decisione se consentire o meno l'aritmetica mista con tipi standard.

Ovviamente, devi anche decidere se la precisione arbitraria è definita in fase di compilazione, o se deve essere determinata in base alle necessità al momento dell'esecuzione.

Evita i problemi di progettazione fondamentali

Potresti quindi fare una prima dimostrazione del concetto, implementando il tuo tipo, ma usando solo un punto mobile privato.

Ciò consentirà di iniziare a definire una suite di test.

Potresti anche scoprire alcuni difetti nell'interfaccia. In questa fase, è ancora facile regolarlo.

Completa il design

Quindi decidi una strategia su come rappresentare i tuoi numeri:

  • vuoi usare un approccio a virgola mobile (cioè mantissa di lunghezza arbitraria e esponente di lunghezza arbitraria)?
  • vuoi usare un approccio frazionario (cioè numeratore e denominatore di lunghezza arbitrario)?
  • vuoi codificare le cifre incluso il segno e la virgola (esempio precedente come è stato fatto nel buon vecchio approccio BCD?

Verifica, se sei chiaro su come le operazioni di base potrebbero essere implementate, prima di andare avanti. È ancora poco costoso cambiare se rilevi problemi importanti.

Implementa il tuo design

Quindi puoi mettere a punto gli interni del tuo tipo. Ovviamente avresti almeno una stringa o un vettore di cifre (le cifre non sono cifre decimali necessarie: potrebbe essere qualsiasi tipo intero), e sicuramente anche due.

La tua attuale suite di test comprovata può essere utilizzata dall'inizio dell'implementazione e ti aiuterà a individuare rapidamente gli errori.

Una volta che tutto sembra funzionare, puoi estendere la tua suite di test con i numeri di precisione veramente grandi che non potresti testare con le prove iniziali del tour.

    
risposta data 26.03.2017 - 19:40
fonte

Leggi altre domande sui tag