DIY FP - Menerapkan matematika titik mengambang pada mikrokontroler tanpa FPU perangkat keras

8

Saya sedang mengerjakan proyek pribadi kecil (menargetkan Propeller Parallax, tetapi ini harus cukup digeneralisasikan) yang membutuhkan matematika floating point.

Kontroler mikro yang bekerja dengan saya tidak memiliki titik apung asli, atau perpustakaan titik apung.

Apakah ada sumber daya yang baik atau tutorial tentang penerapan perangkat lunak matematika floating-point? Lebih disukai pada sumber daya yang sangat terbatas (Saya bahkan tidak punya setumpuk!).


Saya ingin mendukung doublepelampung berukuran besar. Baling-baling adalah MCU 32 bit, jadi saya harus menggunakan beberapa variabel untuk setiap float.

Saya tahu ada satu perangkat lunak floating-point library untuk baling-baling di luar sana, tetapi hanya mendukung singleukuran mengapung.

Tidak, saya mungkin tidak benar-benar membutuhkan doublepelampung berukuran besar, tetapi ini terdengar seperti proyek yang sangat menarik. Setengah alasan saya ingin melakukan ini adalah karena saya akan belajar banyak di sepanjang jalan.

Connor Wolf
sumber
kompiler apa? Saya mungkin telah melewatkannya, tetapi saya tidak melihat bahasa apa yang Anda gunakan.
Kortuk
@Kortuk - Saya pribadi menargetkan Propeller Parallax, jadi itu akan menjadi Spin atau asm. Namun, saya pikir ini seharusnya tidak terlalu spesifik bahasa. Asumsikan saya memiliki operasi umum (+ - / * bit-shifting, bitwise dan / atau / dll.).
Connor Wolf
Operasi apa yang perlu Anda terapkan? Jika Anda hanya ingin menambahkan, mengurangi dan mengalikan, dan Anda tidak terlalu khawatir tentang kasus tepi, NaNs, dll, maka itu seharusnya cukup sepele untuk mengimplementasikannya. Saya sudah melakukannya selama 8 bit mikro-controller di masa lalu dan itu bukan tugas yang sangat besar, bahkan jika Anda melakukan semuanya dalam asm.
Paul R
1
Seperti yang Anda katakan, Anda akan belajar banyak tentang menerapkan operasi floating point di sepanjang jalan.
Paul R
3
Mungkin Anda tidak perlu floating point. Jika Anda hanya perlu angka pecahan juga titik tetap aritmatika dengan desimal (biner aktual) bergeser beberapa tempat ke kiri dapat dilakukan. Bisakah Anda tahu lebih banyak tentang aplikasi Anda?
Curd

Jawaban:

4

Jika Anda ingin melakukannya sendiri, saya katakan lakukan saja.

Saya kira Anda tidak akan menemukan terlalu banyak sumber daya atau tutorial karena tidak banyak.

Berikut ini garis besarnya:

  • tambah / kurangi:
    jika eksponen berbeda terlalu banyak (lebih dari mantissa memiliki bit):
    cukup kembalikan nilainya dengan eksponen yang lebih besar (jika ini adalah subtrahend: negate)

    jika eksponen serupa:
    pindahkan mantissa dengan nilai lebih kecil dengan perbedaan pangkat dan tambahkan / kurangi dari mantissa lain (menggunakan aritmatika titik tetap)
    jika hasilnya bukan 0: pindahkan mantissa hingga MSBit hasil adalah 1 dan kurangi eksponen jumlah yang sama

  • perkalian / pembagian:
    gandakan / bagi mantisa (menggunakan aritmatika titik tetap) dan tambahkan / kurangi eksponen

Dadih
sumber
2

Anda harus dapat menggunakan ini beberapa presisi floating-point perpustakaan di Propeller, dengan baik Catalina C atau gcc. Mungkin terlalu lambat untuk banyak aplikasi.

Leon Heller
sumber
Bisakah kode C pada baling-baling beroperasi dengan Spin atau prop-asm? Jika tidak, saya mungkin harus menerjemahkannya untuk memutar. Untungnya, saya tidak perlu banyak kecepatan. Secara realistis, saya perlu melakukan 7 operasi, pada 2 hz.
Connor Wolf
2
Oh boy, sumbernya sendiri 1,1 MB, zip . Saya pikir itu agak berlebihan. Apakah ada opsi yang lebih sederhana?
Connor Wolf
2
Lebih penting lagi, perpustakaan ini (1) adalah tentang floating point presisi-sewenang-wenang (bukan ukuran asli seperti 32-bit dan 64-bit) dan (2) ini menargetkan kompiler Linux pada prosesor i386 dan x64 Intel, AMD, dan MIPS. Ada yang menyebutkan 'lengan' dan 'generik' di folder sumber, tapi saya tidak akan mulai di sini.
Kevin Vermeer
2

Sepertinya pertanyaan ini diambil untuk mencari pemahaman lebih dari menyelesaikan masalah, jadi ini mungkin bukan jawaban yang paling berguna, tetapi hanya demi kelengkapan

http://code.google.com/p/propgcc/wiki/PropGccCompileOptions

Menyiratkan bahwa versi baling-baling GCC memiliki dukungan floating point, termasuk ganda.

GCC dan perpustakaan kompilernya tentu saja open source, meskipun mungkin ada kurva pembelajaran nyata sebelum Anda bisa mulai melihat apa yang dilakukan kode.

Chris Stratton
sumber