0

C でビット操作を使用して float を切り捨てようとしています。最初に、float を unsigned int に変換します。私の戦略は、指数を取得し、その後ビットをゼロにすることだと思いますが、それをコーディングする方法がわかりません。これは私がこれまでに持っているものです:

float roundDown(float f);
unsigned int notRounded = *(unsigned int *)&f;
unsigned int copy = notRounded;
int exponent = (copy >> 23) & 0xff;
int fractional = 127 + 23 - exponent;
if(fractional > 0){
   //not sure how to zero out the bits. 
   //Also don't know how to deal with the signed part. 
4

2 に答える 2

0

float roundDown(float f);する必要がありますfloat roundDown(float f) {

unsigned int notRounded = *(unsigned int *)&f;最新のコンパイラ最適化と互換性がありません。「<a href="https://stackoverflow.com/questions/98650/what-is-the-strict-aliasing-rule">厳格なエイリアシング」を調べてください。

以下は、2 の累乗に切り捨てる関数です。

#include <stdio.h>
#include <assert.h>
#include <string.h>

float roundDown(float f) {
  unsigned int notRounded;
  assert(sizeof(int) == sizeof(float));
  memcpy(&notRounded, &f, sizeof(int));

  // zero out the significand (mantissa):
  unsigned int rounded = notRounded & 0xFF800000; 

  float r;
  memcpy(&r, &rounded, sizeof(int));
  return r;
}

int main()
{
  printf("%f %f\n", 1.33, roundDown(1.33));
  printf("%f %f\n", 3.0, roundDown(3.0));
}

これにより、次が生成されます。

1.330000 1.000000
3.000000 2.000000
于 2013-02-09T23:42:07.107 に答える