- ベストアンサー
powf を使わずにべき乗を計算
組み込み系で開発しているものです。 どうしても 実数のべき乗 を使わねばならないのですが、 powf があまりに遅くて話になりません。 条件 ・sinf, cosf は使ってもよい(高速なライブラリがあるので) ・指数は符号なし整数のみ(0~10000) ・底は 0.0~1.0 のみ ・戻り値も 0.0~1.0 のみ ・精度は 16bit 位で十分 ・計算しておいてテーブルから呼んでもよい 自作で powf を作りたいのですが、 3時間いろいろやってみてもうまくいきませんでした。 他のやり方は無いでしょうか?
- みんなの回答 (11)
- 専門家の回答
質問者が選んだベストアンサー
その他の回答 (10)
- jacta
- ベストアンサー率26% (845/3158)
- jacta
- ベストアンサー率26% (845/3158)
- Yanch
- ベストアンサー率50% (114/225)
- Yanch
- ベストアンサー率50% (114/225)
- asuncion
- ベストアンサー率33% (2126/6288)
- jacta
- ベストアンサー率26% (845/3158)
- asuncion
- ベストアンサー率33% (2126/6288)
- Yanch
- ベストアンサー率50% (114/225)
- asuncion
- ベストアンサー率33% (2126/6288)
- jacta
- ベストアンサー率26% (845/3158)
関連するQ&A
- べき乗微分の指数の拡張
高校2年生です。 ひょっとしたら高校レベルではないかもしれませんが、少し気になったので質問します。 一般にべき乗微分は (x^n)'=(x^n-1) で表されます。ずっとnは自然数のときのみかと思っていましたが、どうもnは実数の範囲に拡張できるようなのです。 調べてみましたら、指数が負の整数のときについては積の微分公式を使用して証明できましたが、指数が分数のときが、なぜそうなるのか理解できません。 どなたか高校生でも分かるように説明していただけないでしょうか。 またこれは関係ないのですが、反比例の式を原点から定積分するとどうなるのでしょうか。 反比例の式は最大値がありませんが、面積(定積分)はどうなるのでしょうか。
- ベストアンサー
- 数学・算数
- IEEE754の項でべき乗記号を省略する理由は
応用情報技術者試験の過去問で、IEEE754による単精度の浮動小数点表示法が次のように記載されています。 ----------------------------------------------------------------------- 〔IEEE 754〕 0 < E < 255のとき表示される実数 (-1) S × 2E - 127 × (1 + F) ここで、Sは実数の符号(0:正、1:負) Eはげたばき(バイアス付き)の指数 Fは純小数 これらS,E,Fの2進数表示を並べて元の数を表す。 例えば、2進数(0.011) 2は、(-1) 0 × 2125 - 127 × (1 + 0.1) 2なので、 S = 0、E = 125、F = (0.1) 2となる。ここで、()2内の数は2進数を表す。 ----------------------------------------------------------------------- 私の拙い数学知識で解釈すると、 -1×S×2×E-127×(1+F) このようになるのですが。 本来は (-1)^S×2^(E-127)×(1+F) こういう意味のようです。 暗黙の了解のように、べき乗記号が省かれ、 先に計算すべき(E-127)の括弧まで省かれているのですが、 なぜそのような表記になっているんでしょうか。
- ベストアンサー
- 情報処理技術者
- 浮動小数点表現
2^{24}を32bit整数表現及び32bit(単精度)浮動小数点表現で表せ。 結果は16進数で示せ。 符号ビット:MSB 指数部n:7ビット 仮数部:24ビット という問題があるのですが、 解いてみたものの、答えもないのであっているのか分かりません。 以下の答えで合っているでしょうか? また、合っていなかったら、どのように解くのか教えていただけませんか? 整数表現 0100 0000H 浮動小数点 0100 1000 0100 0000 0000 0000 0000 0000
- ベストアンサー
- その他([技術者向] コンピューター)
- 単精度実数の範囲を求める方法を教えて下さい
ご教授願います。 単精度実数では1ビットの符号部、7ビットの指数部、24ビットの仮数部で表し、-3.40282×10^38~3.40282×10^38の範囲を表すとあります。この、-3.40282×10^38~3.40282×10^38はどのように計算すると求められるのでしょうか? よろしくお願い致します。
- ベストアンサー
- その他([技術者向] コンピューター)
- SSEを利用した差分の総和の求め方
現在、できるだけ速く、距離計算を行いたいと考えています。 具体的には、8bit符号なし整数列の距離計算です。 SSEを利用するのが速いので、 _mm_sad_epu8()を使って組みました。 確かに高速に動作しておりますが、 本当はSAD(絶対誤差の総和)ではなく、SSD(2乗誤差の総和)を求めたいのです。 8bitの符号なし整数列を32bitの符号付き整数列に置き換えてから、 計算するのだとは思いますが、どのように組めば効率が良いのか分かりません。 計算の流れは、 ・8bit→32bit ・32bit整数列の差分 ・32bit整数列の乗算(2乗) ・32bit整数列の総和 となると思いますが、 8bit→32bitを行う関数も見当たらないですし、 符号付き32bit整数列の乗算関数も見当たりません。 どなたかご存知であれば、教えていただけると幸いです。
- ベストアンサー
- C・C++・C#
- 浮動小数点とIEEE754
初めまして。 現在、浮動小数点について調べています。 #質問カテゴリ、間違っていたらすみません。 色々調べていると、こんなサイトを見つけました。 http://www.jtw.zaq.ne.jp/kayakaya/new/kihon/text/fudo.htm 分かり易い解説だったんですが、疑問も湧いてきました。 サイトの内容は、0.375を浮動小数点に直すという内容なんですが 汎用型の時は『0.11 × 2の-1乗』 IEEE754の時は『1.1 × 2の-2乗』 で計算しています。 Q1) 汎用とIEEEの違いは『127』を足すだけだと思っていたのですが 『2の-n乗』の直し方も異なるのでしょうか。 もう一つ質問です。 整数入力をIEEE754に準拠したフォーマットで出力させるデジタル回路を作成しています。 出力形式は32bit or 64bitです。(単精度か倍精度) そこで悩んでいるのが入力のbit数とその内訳です。 入力bitは『符号・整数・小数』で形成されているかと思うのですが 符号以外のbit内訳が分かりません。 Q2) 単精度/倍精度、それぞれの入力範囲bitと、その内訳を教えて頂けないでしょうか。 (単精度:合計16bit ⇒ 符号1bit、整数7bit、小数8bit)みたいな感じでお願いします。 宜しくお願いします。 分かりにくい質問でしたらご指摘下さい。
- 締切済み
- その他([技術者向] コンピューター)
- IEEE754 浮動小数点の問題
-10.375(10進数)をIEEE754規格の単精度浮動小数点表現のビット列で示せ。という問題で、 ・仮数部の符号ビットが1bitで指数部が8bitで仮数部が23bitで合計32bitでいいんですよね?本によって割り当てが違うんですけど。 ・僕自身この問題を解いた結果、1 10000010 0100110・・・0 (一番前が、符号bit。真中が指数bit。一番後ろが仮数bit) で合っていますか?答え合わせのほどを。 どうか、願いします。
- ベストアンサー
- その他(インターネット・Webサービス)
- -5.75をIEEE754単精度実数表現
-5.75(10進数)をIEEE754単精度実数表現する問題なんですが、 ・負だから符号ビット(1)…(1) ・5.75=(101.11000…)→1.0111000…×2^2 ・2=b-127 , b=129=(10000001)…(2) ・5.75を2bitで表したやつの小数点以下(0111000…)…(3) (1)(2)(3)を順に並べて『1 10000001 0111000…』 で合っていますか?よろしくお願いします。
- 締切済み
- 数学・算数
- 大きな数、大きな演算精度の実数をあつかえるクラス
1000桁くらいの大きな整数とか、有効数字1000桁くらいの実数の演算が可能なクラスを探しています。十進BASICならできると聞いたので、ダウンロードして試してみてできることは確認しましたが、BASICは20数年ぶりなので、ほとんど忘れています。CかC++で同じような精度の演算ができるライブラリはないでしょうか?
- ベストアンサー
- C・C++・C#
- 浮動小数点(エクセス64形式)、倍精度(64bit)仮数部は何bit?
タイトルの通り、エクセス64形式の倍精度(64bit)のときの指数部、仮数部がそれぞれ何bitなのかわかりません。IEEE形式のものと、単精度(32bit)のものは調べられたのですが・・・ (421C 1999 9999 99A0) 等、いくつかエクセス64形式で表記された値があり、これを実数でいくつになるか確認するためです。 よろしくお願いします。
- ベストアンサー
- その他([技術者向] コンピューター)
お礼
回答ありがとうございます。 >乗算は16ビット×16ビットで計算してから、適当に丸めて16ビット右シフト asuncion さんの解法と組み合わせると、 powf の 12~13倍 は早くなりました。 精度は小数第4位くらいまでなら大体あっています。 まだ高速化できるでしょうか? // 0.0~1.0 を 0~65536 として計算する。 unsigned int powf2(unsigned int f, unsigned short n) { unsigned int ret=65536; if(f==0) return 0; if(n==0) return 65536; if(n==1) return f; for(;n;n>>=1) { if(n & 1) { ret *= f; ret >>=16; } f *= f; f >>= 16; } return ret; }