• ベストアンサー

C#のキャストについて(32bit浮動小数点)

こんにちは。 現在、Visual Studio 2005を使用してC#のプログラムを作成しています。 32bitの浮動小数点のデータを表示しようとしているのですがうまくいきません。 具体的な例としては 0x42F6E9E0  → 123.456789 0x4476E9E0  → 987.654321 のように変換した結果を表したいと考えています。 c言語では int main() { int h = 0x42F6E9D5; float f; f = *(float *)(&h); return 0; } のようにすればfで値(123.45678)が取得できたのですが、 これと同じ事をC#ではどのように書くのでしょうか? ポインタを含んだキャストのやり方がわかりません。 以上よろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

C#は基本的にポインタなぞない(できるかもしれないが普通は使わない) こういう風に書きます namespace Q4974299 { class Q4974299A { public static void Main(string[] args) { int i = 0x42F6E9D5; System.Console.WriteLine(System.BitConverter.ToSingle(System.BitConverter.GetBytes(i),0)); //123.4567 System.Console.ReadKey(true); //何かキーが押されるまで待機 } } }

itouke77
質問者

お礼

ありがとうございます。 便利なメソッドがあるんですね。 MSDNで調べてみます。

その他の回答 (3)

  • Gotthold
  • ベストアンサー率47% (396/832)
回答No.4

誤差とかそういう問題じゃない。 処理系の浮動小数点数の表現方式が期待している方式と異なっていれば 期待しているのとは全く異なる値になる。

itouke77
質問者

お礼

ご指摘ありがとうございました。 なるほどそういうことでしたか。 確かにその通りですね。 浮動小数点について確認してみます。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

念のためですが, 「C言語」ではそのコードで期待した値が得られることを保証していません.

itouke77
質問者

お礼

ご指摘ありがとうございます。 実際に誤差が生じるとしたらどの程度になるのでしょうか?

回答No.2

基本的に、No1さんがおっしゃるようにC#ではポインタという概念はありません。 でもどうしてもポインタを使いたい場合があったりします。 たとえば、画像処理プログラムなどで、 読み込んだ画像のピクセルデータを変換したいとか(RGB要素を入れ換えるとか) だと、GetPixelメソッドなりを使用するのが一般的かもしれません。 ただ、実はこの処理が非常に遅かったりします。 そこで、読み込んだ画像データをメモリ上で操作すれば高速化します。 この時にポインタを使用します。 C#でポインタを使用するためには、unsafeコードで記述します。 参考サイト http://www.atmarkit.co.jp/fdotnet/csharp_abc/csharp_abc_021/csharp_abc05.html unsafe { unsafeコード内ではポインタが使用できます。 } 今回の質問の内容をunsafeコードで記述すると…。 int i = 0x42F6E9D5; unsafe { int* ip = &i; float* fp = (float*)ip; float f = *fp; } これで、float型fの中身はお望みの値になってるかと思います。 (※)unsafeコードを記述するにはプロジェクトプロパティのビルド項目で、    アンセーフコードの許可を指定してください。

itouke77
質問者

お礼

ありがとうございます。 自分はC言語から入っていったのでこちらの記述はしっくりきます。 sonata1229さんのおっしゃる通り、用途次第で使い分ける必要がありそうですね。 参考になります。

関連するQ&A

  • 浮動小数点表現

    浮動小数点表現の問題で以下の実行結果を元にfloat型変数 f に与えた実数の実際に格納されているビット列を表示するプログラムを作りたいのですが、 #include<stdio.h> main() { float a; scanf("%f",&a); printf("%f",a); } この程度までしか作れません。ポインタを使ってアドレスを表示することは分るのですが…。 どなたか教えていただけると助かります。 実行結果 Size of Float : 4 byte Size of Int : 4 byte f=0.500000000000000 00111111000000000000000000000000

  • 浮動小数点の比較について

    たとえば、以下のコードで、「違う」と表示されるように、浮動小数点の比較に失敗します。 #include <iostream> int main() { float f = 0.1; if (f == 0.1) { std::cout << "同じ"; } else { std::cout << "違う"; } return 0; } double f; とすれば、同じと表示させるのですが、代入して比較するだけで、比較に失敗するのは、どういう理由なのでしょうか?

  • 浮動小数点エラー

    #include<stdio.h> main (){ float D[5][6] = { {0,0,151.9058382,111.8925551,238.1626765,145.6362657},   {0,151.9058382,0,256.9532465,317.3522119,232.5861795}, {0,111.8925551,256.9532465,0,181.0294098,114.6471}, {0,238.1626765,317.3522119,181.0294098,0,93.41311845} ,   {0,145.6362657,232.5861795,114.6471,93.41311845,0}, };   float data[100][100] ; int n=5; float sum; int i,l; for(i=1;i<=n-2;i++) { sum=0; for(l=i+2;l<=n;l++) { sum=sum+D[i][l]; } ◎ data[i]=D[i][i+1]/(sum/(n-(D+1)));  ←この行 } for (i=1;i<=n;i++){ printf("%f",data[i]); } return (0); } 上のプログラムで、◎の行に浮動小数点の不正な使用とエラーがでてしまいます。 参考書、ヘルプで調べたもののなぜエラーとなるか分かりませんでした。 解決できますでしょうか?

  • 浮動小数点の切り捨てで-0.5を-1に。

    こんにちは。 小数点以下を切り捨てたいときにキャストするために 以下のようにしたところ、 float  i ; for( i=-2.5f; i<3.5f; i+=1.0f ) {   printf( "%f %d\n", i, (int)i ) ; } -2.500000  -2 -1.500000  -1 -0.500000  0 0.500000  0 1.500000  1 2.500000  2 上記の様な結果になりましたが、これを -2.500000  -3 -1.500000  -2 -0.500000  -1 0.500000  0 1.500000  1 2.500000  2 のように-0.5なら-1にするようしたいのですが、 if文は使わずに計算だけで変換することは 可能でしょうか ?

  • 浮動小数点数の float型 での最少値について調べています。

    浮動小数点数の float型 での最少値について調べています。 「Visual C++ 2008 Express Edition」の「float.h」の中には、    #define FLT_MIN     1.175494351e-38F   /* min positive value */    #define FLT_MIN_EXP  (-125)           /* min binary exponent */ という記述があります。 float型で表現できる最少値が「1.175494351e-38F」なのだろうと思い、 下記のように 2^-125 を計算してみました。    printf("結果は、「%e」です。", pow((double)2, (double)(-125))); 実行結果は、    結果は、「2.350989e-038」です。 となり、「float.h」の「FLT_MIN」には一致しませんでした。 試しに、下記のようにしてみると( 2^-125 を 2^-126 に変えてみました )    printf("結果は、「%e」です。", pow((double)2, (double)(-126)));    結果は、「1.175494e-038」です。 となって「float.h」の「FLT_MIN」と「ほぼ一致」しているように見えます。 float型での最小値(FLT_MIN)を計算する際に「float.h」での「FLT_MIN_EXP」を使って    2^-125 とするのは間違っているのでしょうか?

  • 『浮動小数点』について

    最近、ふと『浮動小数点』について疑問を持ちました。 それは『浮動小数点』がどんな場合に役立つのか?という事です。 C言語では標準で『float』型と『double』型がありますよね。 私は昔、C言語を始めたころにテスト・プログラムなどで使った経験しかなく その後に『電卓ソフト』を作ろうとしたときに『誤差』が原因で役に立たない ことを知りました。『誤差』があることは知っていましたが…。 そこで質問。内容は『浮動小数点』はどんな場面で利用されているかです。 実際の『ソフトウェア開発』や趣味でフリーソフトを作った場合も含み、あと こんな場面で役に立つのではという事を知りたいのです。 アンケートみたいになりますが、『アンケート』カテゴリでは、あまり回答などが 集まらないと思い『C/C++』カテゴリのこちらで質問としました。 よろしくお願いします。

  • IEEE754浮動小数点規格

    14.625をIEEE754浮動小数点規格の単精度(float)の書式(-1)^s ×1.f×2^(e-127)に直す場合、この値をとりあえず2進数に直すのですが、 14.625=+1110.101となると書いてあったのですが、 14を二進数に変換すると1110になることはわかるのですが、625がなぜ、101になるのかわかりません。僕自身、単に625を計算したら、101110001になりました。どう625を2進数に変換したらよいですか。

  • C言語による浮動小数点表示

    #include<stdio.h> #include<math.h> main() { float a=1.5*pow(2,-15); unsigned char *e; e=(unsigned char *)&a; printf("a=%02x,%02x,%02x,%02x\n",*(e+3),*(e+2),*(e+1),*(e+0)); } というプログラムで a=38,40,00,00 という結果がでたのですが これは何を表しているのでしょうか? よろしくおねがいします

  • 浮動小数点演算と固定小数点演算の使い分けについて

    解説書などには、「浮動小数点は3.14E0の形」や「固定小数点は3.14」などと説明されています。 では、例えば、ごく一般的な32ビットマシンで「3.14 * 45.6」という命令を書いたときに演算されるのは浮動小数点演算なのか、固定小数点演算なのかがわかりません。例えばIntelのx86CPUは、内部にFPUを持っているそうですが、この場合は「3.14 * 45.6」は、内部では必ず浮動小数点演算になっているということなのでしょうか? 「3.14 * 45.6」を「3.14E0 * 4.56E1」と書いた場合にしか浮動小数点演算されないということではないと思っているのですが、実際の浮動小数点演算と固定小数点演算の内部的な切り替えがわかりません。 理解が足りなくて、おかしな質問になっていましたら、その点もご指摘いただければうれしいです。

  • 浮動小数点をXの倍数(整数)に丸める方法

    浮動小数点数Fを、Fにより近いX(整数)の倍数(整数)に丸める方法を教えてください。 自分なりにコード化しましたが、イマイチ美しくないです^^; もっとスッキリした方法があれば教えてください。 よろしくお願いします。 ※Fは正の浮動小数点数に限定します。 long L, mod ; L = (long)F ; //キャストして小数点以下を切り捨てて整数化 mod = L%X ; //Xで除算して余りを求める if ( mod ==0 ) { //既にXの倍数なので何もしない ; } else if ( mod <= X/2 ) { //余りがX/2より等しいか小さい時 L -= mod ; //余りを減算する } else { //mod > X/2の時 L += X-mod ; //Xに満たない分を加算 }

専門家に質問してみよう