質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.48%

  • C

    3820questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

  • プログラミング言語

    692questions

    プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

  • アーキテクチャ

    83questions

    アーキテクチャとは、情報システム(ハードウェア、OS、アプリケーション、ネットワーク等)の設計方法、設計思想、設計思想に基づいて構築されたシステム構造をアーキテクチャと呼びます

  • マイコン

    70questions

    マイクロコンピュータの略で、CPUにマイクロプロセッサを用いたコンピュータのこと。家電製品、電磁機器などの制御に用いられています。単体でコンピュータとしての機能を一通り備えています。 現代のパーソナルコンピュータに近く、同時期のメインフレームやミニコンピュータと比べ、小さいことが特徴です。

16bitのプロセッサに数値計算をさせたいときに使える変数型

解決済

回答 6

投稿

  • 評価
  • クリップ 0
  • VIEW 429

matsu_phy

score 1

皆さんは8,16bitのマイコンにある程度の正確さと速さを求められる数値計算をさせたいとき、どのような変数型を使っていますか?
short(16bit)やchar(8bit)などの整数型を使って計算させると、簡単にオーバーフローしてしまうと思うのですが、どうすればよいのでしょうか?

16bitマイコン(PIC24FJ64GA002)を使ってリアルタイムで高速フーリエ変換をさせたいと思い、この問題を解決するために16bitの固定小数点数(整数部7bit,小数部8bit,符号1bit)をC言語のソースコードで実装し、計算させてみたのですが、FFTの点数が512程度になってくるとやはりオーバーフローを起こしてしまいます。

固定小数点数に限界を感じたので、浮動小数点数を使いたいと思ったのですが、floatやdoubleなどの浮動小数点数は32bit以上の変数です。8bitや16bitのマイコンでも使えますが、これが最適なのでしょうか?

そこに疑問を感じて、16bitの浮動小数点数(仮数部10bit,指数部5bit,符号1bit)をソースコードで実装しようと、プログラムを作ろうと思ったのですが、私には骨の折れる作業なので、これが意味のあることなのか不安になって質問させていただきました。

今私が作ろうとしているものは、音楽用の簡易な観賞用のリアルタイムスペアナです。
よろしくおねがいします。

 発生している問題・エラーメッセージ

double, floatが使えない場合に数値計算がしたいとき、どのような変数型を使えばよいのか

 試したこと

ソースコードによる固定小数点数の実装。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 6

checkベストアンサー

+3

C言語で書かれているという事は、コンパイラを使っていると思いますが、浮動小数点用のライブラリは無いでしょうか?  ただし、浮動小数点の演算をソフトでやると遅いです。リアルタイム処理に使うのは、現実的か? ... 使い方次第でしょうか。

と思って、CPU(PIC24F)の仕様を探したら、16bit x 16bitの演算もできるようですね。(当然?) とすると、C言語でも使えないでしょうか? CPU仕様を見ると、  16bit x 16bit => 32bit になるようです。
また、オーバーフローとの事ですが、16bitに入らないだけて、32bitなら、OK? それとも、更にサイズが必要なのでしょうか? 本格的な多倍長計算は大変でも桁数を限定したものなら、少し頑張れば出来ると思います。

[追記]
コンパイラの記述が無いので分かりませんが、 long(32bit) は使えませんか? 使えれば、演算結果が 32bitまでOKですね。 この手のコンパラだと、組込み演算でやってそうですが、、、。
自前で行っても 32bit x 32bit は、16bitx16bit乗算 4回と 32bitシフト(or なんか) 32bit 加算 3回でできますね。 (オーバーフロー処理とか除く)

[追記2]
質問をよく読んでませんでした。

この問題を解決するために16bitの固定小数点数(整数部7bit,小数部8bit,符号1bit)

16bitを分割するより、整数部 16bit, 小数部 16bitにされた方が、効率は良いと思います。実装がどうなっているか分かりませんが、16bit CPUならば、16bit単位で処理するのが一般には効率的です。

16bitの浮動小数点数(仮数部10bit,指数部5bit,符号1bit)

については、仮数部10bit に収まれば、価値はあるでしょうが、固定小数点の方が確実に速いと思います。 まずは、固定小数点の bit数を増やす事を検討されたら、どうでしょうか。(オーバーふーについては、事前検討を)

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/23 16:58

    回答ありがとうございます。みなさんが言うように浮動小数点数をソフトでやるのは効率が悪いようですね。固定小数点数を使ってがんばってみたいと思います。

    キャンセル

+2

質問の方向性とは違う回答になりますが、音楽用スペアナなら専用ICを使って作ると楽なはずなので、どうしてもFFTで作りたいという事情がなければそっちをおすすめします。

オーディオ用7バンドスペクトラムアナライザ-用IC MSGEQ7P: 半導体 秋月電子通商 電子部品 ネット通販

このICを使った作例は検索すれば出てくるので、模倣すれば基本的には行けると思います。

データシートのブロック図を見ると、このICと同等の機能のものを自作するのもそんなに難しくはなさそうです(バンドパスフィルタのはんだ付けが骨かもしれませんが)。微妙に機能に満足できない・・・なら挑戦してみるのも楽しいかもしれません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

こんにちは。

速度を追求する場合に固定小数点を使うのは良い選択と思います。
浮動小数点は速度ではなくプログラミングの手間を省く時に良い選択です。(固定小数点でオーバーフローさせないのは無茶苦茶たいへんですから。)

浮動小数点演算機をハードウェアで持っていないCPUで高速演算したい場合は固定小数点一択と思います。
しかし、もし演算速度が要求を満たすのでされば浮動小数点を用いればプログラミングが格段に楽になります。
浮動小数点演算ライブラリを自力で作るのではなく既にあるものを使う前提です。フリーなライブラリはありそうな気がします。http://www.picfun.com/mathlib01.html

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

本題とは違うかもしれませんが、FFT使うならば実数どころか複素数計算が必要です。特段の複素数演算ライブラリを使うわけでない限り、プリミティブ型を組み合わせて複素数計算を独自定義するでしょうから、ここの部分を切り替えることで精度とかを調整できると思いますが。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

あまりマイコンをC言語で使ったことはありませんが、
この状況では32bit固定小数点数が最適でしょうね。
浮動小数点数はCPUが直接処理できない場合、複数命令からなるルーチンで処理するので非常に遅いです。
浮動小数点数を使うよりは、桁数が多くても整数演算で済ませた方が早いでしょう。

16bit浮動小数点数を自作する件ですが、浮動小数点数を扱うこと自体が手間なので、ビット数が16bitでも32bitでも処理時間はほとんど変わらないと思います。
どうせ作るなら、仮数部16bitケチ表現なし・指数部+符号16bitとかにすると速いでしょう。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

double、floatが使えないなら、自分で実装すればOK
それが無理と言うなら、そもそもCPUの選定ミスです


浮動小数点変数の実装、計算ライブラリの作成ってのは案外簡単ですぜ。
初心者の方のトレーニングにはちょうどいいかと。

#まあしかし、ROMのサイズ的にFFT含めて収まるのかというのはべつのおはなしw

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.48%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    Swift doubleとfloatの違いに関して

    皆様、質問がございます。よろしくお願い申し上げます。 swiftにはdouble型とfloat型がありますが、これらの違いってなんだろうと疑問を持ったため質問致します。 現在、

  • 解決済

    任意の浮動小数点数を文字列に変換、逆変換して元に戻せるか

    任意のfloat(32ビット、IEEE形式)の値をprintfのように文字列に変換し、それを逆変換して元のfloatとビット列を完全に一致させることは可能なのでしょうか? 文字列化

  • 解決済

    swiftのFloatingPointType

    extensionの文で構造体VectorのT型はFloatingPointTypeに批准している必要があるとなっているのですが、FloatingPointTypeとはどういう意味

  • 解決済

    立方体のfについて

    お世話になります。 javaで立方体を作るときに気になったのですが private float vertices[] = { -1.0f, -1.0f, -1.0f,

  • 解決済

    IEEE規格754による実数表現について

    質問内容 長さが32の0と1の列を入力して、このビット列の表す実数値を出力するC言語のプログラムで実数表現の仕方はIEEE規格754に従うものと仮定するCプログラムを作成したいの

  • 解決済

    C言語のunsigned doubleとは何か?

    C言語にはunsigned doubleという型があるらしいという情報を入手しました。しかし、C言語規格上はそのような型は存在しませんし、手元のコンパイラ(LLVMとGCC)ではコ

  • 解決済

    C言語についての質問

    c言語 このプログラムを動かし足し算~割り算をしたいのですが、動きません。 どこが悪いのか、ここはこうしたほうがいいというところを教えてください。 include <stdio

  • 解決済

    Socket通信でstreamにbyteを書き込む方法について

    C#を使っています. Socket通信を用いて,Simulinkモデルと数値を送受信する場合についての質問です. float msg = 2.689f を byte[

同じタグがついた質問を見る

  • C

    3820questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

  • プログラミング言語

    692questions

    プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

  • アーキテクチャ

    83questions

    アーキテクチャとは、情報システム(ハードウェア、OS、アプリケーション、ネットワーク等)の設計方法、設計思想、設計思想に基づいて構築されたシステム構造をアーキテクチャと呼びます

  • マイコン

    70questions

    マイクロコンピュータの略で、CPUにマイクロプロセッサを用いたコンピュータのこと。家電製品、電磁機器などの制御に用いられています。単体でコンピュータとしての機能を一通り備えています。 現代のパーソナルコンピュータに近く、同時期のメインフレームやミニコンピュータと比べ、小さいことが特徴です。