C言語でべき乗表現

こんにちは、NAKAといいます。

C言語基礎を確認させてください。

pow()っていう関数を使うと思うのですが

例えば2^15って0x8000だと思うのですが、実際やってみると0x7FFFになってしまいます。

Parents
  • トピックの本筋じゃないのですが、私は整数変数を宣言するのにintなんて怖くてそうそう使えないと思ってしまう人です。int8_t、int16_t、int32_t、int64_tとビットサイズを明示するようにしています。#include <stdint.h>これは必須だと思っています。ましてやdoubleなんて怖くてなかなか手が出ません。MビットとNビットの掛け算はM+Nビット必要な訳ですよね。Mビット同士の足し算ならM+1ビット。でもビット数を明示しないコードですと移植した先でトラブルの元なんです。こういう部分はFPGAの論理合成は必要ビット数の割り当てで文句を言ってくれるので不注意な私にはありがたいです。

    なお️計算はなるべく整数化しています。PID制御はdoubleやfloatは使いません。整数化した後にmath.hのsqrt()とかも処理能力や単精度浮動小数型の誤差が怖いから整数演算で処理する関数で解くようにしています。確か「ハッカーのたのしみ」って書籍に書いてあったニュートン法を使ったコードだったかな。計算機で計算を実装する機会があるならNumerical Recipes in Cとかの関連する章を参考にするのも良いかもと思います。

Reply
  • トピックの本筋じゃないのですが、私は整数変数を宣言するのにintなんて怖くてそうそう使えないと思ってしまう人です。int8_t、int16_t、int32_t、int64_tとビットサイズを明示するようにしています。#include <stdint.h>これは必須だと思っています。ましてやdoubleなんて怖くてなかなか手が出ません。MビットとNビットの掛け算はM+Nビット必要な訳ですよね。Mビット同士の足し算ならM+1ビット。でもビット数を明示しないコードですと移植した先でトラブルの元なんです。こういう部分はFPGAの論理合成は必要ビット数の割り当てで文句を言ってくれるので不注意な私にはありがたいです。

    なお️計算はなるべく整数化しています。PID制御はdoubleやfloatは使いません。整数化した後にmath.hのsqrt()とかも処理能力や単精度浮動小数型の誤差が怖いから整数演算で処理する関数で解くようにしています。確か「ハッカーのたのしみ」って書籍に書いてあったニュートン法を使ったコードだったかな。計算機で計算を実装する機会があるならNumerical Recipes in Cとかの関連する章を参考にするのも良いかもと思います。

Children
No Data