C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。
前スレ
C++相談室 part143
https://mevius.5ch.net/test/read.cgi/tech/1560574313/
このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.105【環境依存OK】
https://mevius.5ch.net/test/read.cgi/tech/1556142878/
■長いソースを貼るときはここへ。■
http://codepad.org/
https://ideone.com/
[C++ FAQ]
https://isocpp.org/wiki/faq/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
----- テンプレ ここまで -----
C++相談室 part144
■ このスレッドは過去ログ倉庫に格納されています
2019/07/22(月) 13:18:35.52ID:gptRHpgT
403蟻人間 ◆T6xkBnTXz7B0
2019/08/11(日) 00:49:51.23ID:KV8Qszx5 割り当てされてない領域に書き込むというのは、C/C++ではあり得る。
そこに他に意味のあるデータがあれば、そのデータは壊れる(データ破壊)。
そこに他に意味のあるデータがあれば、そのデータは壊れる(データ破壊)。
404デフォルトの名無しさん
2019/08/11(日) 07:16:49.27ID:bWvktEwN >>402
処理系によるけど大抵の処理系では指定されたサイズをきっちり確保とかはしなくて16バイト単位くらいで確保する
なのでそのdatasizeの値によっては-15とかしても大丈夫な場合すらあることがある
もちろん動作は保証されない
処理系によるけど大抵の処理系では指定されたサイズをきっちり確保とかはしなくて16バイト単位くらいで確保する
なのでそのdatasizeの値によっては-15とかしても大丈夫な場合すらあることがある
もちろん動作は保証されない
405デフォルトの名無しさん
2019/08/11(日) 08:16:38.18ID:8PrAFYrU > malloc(datasize)ではなく、malloc(datasize+1)でぴったりメモリ確保ができているのでしょうか?
malloc(datasize)で十分、malloc(datasize+1)だと1つ余分
freadでもprintfでもdatasize個までしかアクセスしていないので
malloc(datasize)で十分、malloc(datasize+1)だと1つ余分
freadでもprintfでもdatasize個までしかアクセスしていないので
406デフォルトの名無しさん
2019/08/11(日) 09:14:50.61ID:G1nCiIo0 とりあえずvalgrindかけてみるのが良い。
407デフォルトの名無しさん
2019/08/11(日) 10:12:56.60ID:rgBQlH0q 昔みたいにメモリ枯渇なんてそうないし誰かがデータ破壊やらかして休みに呼び出し食らいたくないので16バイトくらい余計に確保しとこ
408デフォルトの名無しさん
2019/08/11(日) 10:13:58.51ID:5go57VsQ なんでビット単位で確保できないんですか?
409デフォルトの名無しさん
2019/08/11(日) 10:36:40.97ID:x7hs8Ubh 面倒だし遅いし...
410デフォルトの名無しさん
2019/08/11(日) 10:41:05.01ID:EQYlQ9TU CPUがそう出来てないから
411395
2019/08/11(日) 11:36:18.32ID:khTmYGk1 >>404
malloc()は数を指定していて、for分でアクセスしているdataは配列だから最後はdatasize-1ということですね。
僕の理解と合いました。
malloc(datasize)とします。
ありがとうございます。
次にgzipの全読み込みも調べています。
とりあえず下記でout.dbと展開後のaaa.dbのcksum値が一致したのでちゃんと読み込めたと思います。
※1のところで配列に格納すれば良いと思うのですが、最初は配列の数が確定していないので
配列数を決定することができません。
読み込むファイルサイズはギガバイトクラスの大きなファイルなので、なるべく速度を維持したまま
一つの配列に格納したいのですが、どうすれば良いですか?
FILE *wfp;
gzFile rzp;
unsigned char buf[8192*1000] = {0};
rzp = gzopen("aaa.db.gz", "rb");
wfp = fopen("out.db", "wb");
while((cnt = gzread(rzp, buf, sizeof(buf))) > 0){
fwrite( buf, sizeof( unsigned char ), cnt, wfp );
※1 ここで全データを一つの配列に格納したい。
}
gzclose(rzp);
fclose(wfp);
malloc()は数を指定していて、for分でアクセスしているdataは配列だから最後はdatasize-1ということですね。
僕の理解と合いました。
malloc(datasize)とします。
ありがとうございます。
次にgzipの全読み込みも調べています。
とりあえず下記でout.dbと展開後のaaa.dbのcksum値が一致したのでちゃんと読み込めたと思います。
※1のところで配列に格納すれば良いと思うのですが、最初は配列の数が確定していないので
配列数を決定することができません。
読み込むファイルサイズはギガバイトクラスの大きなファイルなので、なるべく速度を維持したまま
一つの配列に格納したいのですが、どうすれば良いですか?
FILE *wfp;
gzFile rzp;
unsigned char buf[8192*1000] = {0};
rzp = gzopen("aaa.db.gz", "rb");
wfp = fopen("out.db", "wb");
while((cnt = gzread(rzp, buf, sizeof(buf))) > 0){
fwrite( buf, sizeof( unsigned char ), cnt, wfp );
※1 ここで全データを一つの配列に格納したい。
}
gzclose(rzp);
fclose(wfp);
412デフォルトの名無しさん
2019/08/11(日) 12:32:14.46ID:G+0fIs5w gzipって全部読まないと展開後の長さ分からないんじゃね
2パスにするとか
2パスにするとか
413デフォルトの名無しさん
2019/08/11(日) 17:00:08.00ID:x7hs8Ubh qiitaでさC++のタグ検索したらcppreference.comが公式リファレンスと書かれてたけどここ公式なの?
414デフォルトの名無しさん
2019/08/11(日) 17:08:33.67ID:CsmlJ4sC >>413
https://ja.cppreference.com/w/Cppreference:FAQ
このサイトの背後にいるのは誰ですか?
cppreference.com は世界中の C++ 愛好家のグループによって作成され、メンテナンスされています。
https://ja.cppreference.com/w/Cppreference:FAQ
このサイトの背後にいるのは誰ですか?
cppreference.com は世界中の C++ 愛好家のグループによって作成され、メンテナンスされています。
415395
2019/08/11(日) 18:01:46.19ID:khTmYGk1 >>412
コメントありがとうございます。
全部読む以外に調べる方法は無いんですね。
ということでrealloc()で拡張していくことを考えてみました。
下記で作られた解凍後のデータがgunzipで解凍したものと一致したので大丈夫そうです。
ありがとうございました。
#define MAX_BYTE 8192*1000
data = (unsigned char*)malloc(MAX_BYTE);
rzp = gzopen("aaa.db.gz", "rb");
long data_size = 0;
while((cnt = gzread(rzp, data+data_size, MAX_BYTE)) > 0){
data_size += cnt;
data_new = (unsigned char*)realloc(data, data_size+MAX_BYTE);
if( data_new == NULL ){
free(data);
::fprintf(stderr, "拡張失敗\n");
exit(EXIT_FAILURE);
}
// アドレスが変化した場合
if( data != data_new ){
// free(data); // 元オブジェクトは解放済みのため不要
data = data_new;
}
}
gzclose(rzp);
// 解凍後データを書き込み
wfp = fopen("out.db", "wb");
fwrite( data, sizeof( unsigned char ), data_size, wfp );
fclose(wfp);
コメントありがとうございます。
全部読む以外に調べる方法は無いんですね。
ということでrealloc()で拡張していくことを考えてみました。
下記で作られた解凍後のデータがgunzipで解凍したものと一致したので大丈夫そうです。
ありがとうございました。
#define MAX_BYTE 8192*1000
data = (unsigned char*)malloc(MAX_BYTE);
rzp = gzopen("aaa.db.gz", "rb");
long data_size = 0;
while((cnt = gzread(rzp, data+data_size, MAX_BYTE)) > 0){
data_size += cnt;
data_new = (unsigned char*)realloc(data, data_size+MAX_BYTE);
if( data_new == NULL ){
free(data);
::fprintf(stderr, "拡張失敗\n");
exit(EXIT_FAILURE);
}
// アドレスが変化した場合
if( data != data_new ){
// free(data); // 元オブジェクトは解放済みのため不要
data = data_new;
}
}
gzclose(rzp);
// 解凍後データを書き込み
wfp = fopen("out.db", "wb");
fwrite( data, sizeof( unsigned char ), data_size, wfp );
fclose(wfp);
416デフォルトの名無しさん
2019/08/11(日) 18:25:47.16ID:bWvktEwN417395
2019/08/11(日) 19:34:48.78ID:khTmYGk1418デフォルトの名無しさん
2019/08/11(日) 19:44:47.41ID:bWvktEwN >>417
> 2パスをググってもそれらしいものがなかったのですが、どういうものなのでしょうか?
1回目(Pass 1)ではデータの格納はせずにサイズだけ取得する
合計サイズ分を確保して2回目(Pass 2)で実際に格納するってこと
> あと、「各領域をリストで繋いて」というのはvectorに追加しながら最後に連結するということでしょうか?
そう言うこと
でかいデータはコピーにも時間がかかるからできるだけコピーしないようにした方がいい
> 2パスをググってもそれらしいものがなかったのですが、どういうものなのでしょうか?
1回目(Pass 1)ではデータの格納はせずにサイズだけ取得する
合計サイズ分を確保して2回目(Pass 2)で実際に格納するってこと
> あと、「各領域をリストで繋いて」というのはvectorに追加しながら最後に連結するということでしょうか?
そう言うこと
でかいデータはコピーにも時間がかかるからできるだけコピーしないようにした方がいい
419395
2019/08/11(日) 20:30:35.16ID:khTmYGk1 >>417
2パス良さそうですね。
gzread(rzp, data+data_size, MAX_BYTE)
のところを下記のようにNULLにしてもちゃんとファイルの最後まで動いているようなのですが、これがデータ格納せずにサイズを取得するということでしょうか?
gzread(rzp, NULL, MAX_BYTE)
2パス良さそうですね。
gzread(rzp, data+data_size, MAX_BYTE)
のところを下記のようにNULLにしてもちゃんとファイルの最後まで動いているようなのですが、これがデータ格納せずにサイズを取得するということでしょうか?
gzread(rzp, NULL, MAX_BYTE)
420デフォルトの名無しさん
2019/08/11(日) 20:43:01.53ID:khTmYGk1 すみません、NULLだとそもそも一回も取得できずに終わっていました。。
データ格納せずに一回ファイル精査するのってどうするんでしょうか?
データ格納せずに一回ファイル精査するのってどうするんでしょうか?
421デフォルトの名無しさん
2019/08/11(日) 21:37:44.09ID:vST/kP4M >>420
固定長のバッファを1つ用意して、そこに上書きしながら繰り返し読み込めばいい。内容は上書きされて読めなくなるけど、読み捨てるつもりなので気にしない。
固定長のバッファを1つ用意して、そこに上書きしながら繰り返し読み込めばいい。内容は上書きされて読めなくなるけど、読み捨てるつもりなので気にしない。
422デフォルトの名無しさん
2019/08/11(日) 21:42:34.43ID:bWvktEwN (最終的なところに)格納しないってことな
適当なバッファを1つ用意して毎回そこに格納しとけばいい
適当なバッファを1つ用意して毎回そこに格納しとけばいい
423デフォルトの名無しさん
2019/08/11(日) 21:43:08.15ID:bWvktEwN あっ、被ってた
424デフォルトの名無しさん
2019/08/11(日) 22:55:38.50ID:khTmYGk1 >>421,422
そういうことですか、理解できましたありがとうございます。
そういうことですか、理解できましたありがとうございます。
425デフォルトの名無しさん
2019/08/12(月) 00:27:35.40ID:Y24CRytA vectorだって償却定時間なのに
ホントに2回読む方が速いんか?
ホントに2回読む方が速いんか?
426デフォルトの名無しさん
2019/08/12(月) 00:55:04.06ID:owwy1DHX valgrindってみんな開発に使ってるの?死ぬほど遅いんですが
427デフォルトの名無しさん
2019/08/12(月) 09:13:50.21ID:QXujyVaw でかい領域のreallocで毎回コピーが発生するというのは都市伝説、
と言いたいところだが他のスレッドが動いているとそうとも言い切れないかそうか、
この場合の2パス方式はgzipが2回走るのがいかにも実行時間の無駄でいやすぐる
最初に大きめの領域をmallocして足りんかったら2パスに切り替えるという投機的なやり方のが良い
と言いたいところだが他のスレッドが動いているとそうとも言い切れないかそうか、
この場合の2パス方式はgzipが2回走るのがいかにも実行時間の無駄でいやすぐる
最初に大きめの領域をmallocして足りんかったら2パスに切り替えるという投機的なやり方のが良い
428デフォルトの名無しさん
2019/08/12(月) 09:18:32.18ID:QXujyVaw だいたいいかにgzip様といってもファイルを毎回1/10まで圧縮できるわけはないのだから
読み込むファイルサイズの10倍を確保しておけばほぼ1パスで済む
展開後の実サイズがわかったら展開後の実サイズぴったりにreallocで縮小すれば良い
ちなメモリの断片化はガン無視
実使用サイズの倍のメモリも用意できないようなプアな環境のならmallocやreallocする設計から見直さねばならない
見直すべき
読み込むファイルサイズの10倍を確保しておけばほぼ1パスで済む
展開後の実サイズがわかったら展開後の実サイズぴったりにreallocで縮小すれば良い
ちなメモリの断片化はガン無視
実使用サイズの倍のメモリも用意できないようなプアな環境のならmallocやreallocする設計から見直さねばならない
見直すべき
429デフォルトの名無しさん
2019/08/12(月) 10:16:31.87ID:Mc0sgLDk430デフォルトの名無しさん
2019/08/12(月) 10:19:40.97ID:QXujyVaw >>429
ヒープメモリはスレッドで共有される
もしヒープメモリを使う他のスレッドが一切無いなら
realloc()でサイズ拡大してもコピーは生じない(後ろに領域伸ばせるから
この説明でまだ疑念が渦巻くのならプログラミング言語Cをきちんと読み直した砲が良い
(あのmalloc()実装例がmalloc()実装の全てとは言わんが基本
ヒープメモリはスレッドで共有される
もしヒープメモリを使う他のスレッドが一切無いなら
realloc()でサイズ拡大してもコピーは生じない(後ろに領域伸ばせるから
この説明でまだ疑念が渦巻くのならプログラミング言語Cをきちんと読み直した砲が良い
(あのmalloc()実装例がmalloc()実装の全てとは言わんが基本
431デフォルトの名無しさん
2019/08/12(月) 10:26:54.62ID:q+3SbcDd そうとは限らんのでは?
432デフォルトの名無しさん
2019/08/12(月) 10:28:45.76ID:Mc0sgLDk433デフォルトの名無しさん
2019/08/12(月) 10:35:35.84ID:q+3SbcDd 特にこの場合はgzipを使うからね
アウトプット用のメモリを確保した上でgzipを実行するわけだけど
gzipが内部で動的にメモリを確保するかしないかは知らんけど、多分するでしょ
そうすると新たに論理アドレス空間が使われるから
連続したメモリ空間を後ろに拡張できるかって言われるとね
アウトプット用のメモリを確保した上でgzipを実行するわけだけど
gzipが内部で動的にメモリを確保するかしないかは知らんけど、多分するでしょ
そうすると新たに論理アドレス空間が使われるから
連続したメモリ空間を後ろに拡張できるかって言われるとね
434デフォルトの名無しさん
2019/08/12(月) 10:43:33.86ID:QXujyVaw435395
2019/08/12(月) 11:18:22.87ID:lzJUIRtk 色々とご意見ありがとうございます。
どなたかの役にたてばと思い僕が調べた内容をお知らせします。
gzip展開後に5GBくらいになるデータでテストしてみました。
@time ./a.outで簡易的に時間取得
Arealloc方式の場合 >>415 の下記部分でコピーが何回発生しているかをカウントしてみる
// アドレスが変化した場合
if( data != data_new ){
// free(data); // 元オブジェクトは解放済みのため不要
data = data_new;
copy +=1; // コピーした回数をカウント
}else{
not_copy +=1; // コピーせずに拡張できた回数をカウント
}
結果は以下のようになりました。
強力なサーバでメモリが潤沢にあるためか、コピーがほとんど発生しないようで
realloc方式が早かったです。
本日祝日でサーバ使用者が少なく、よりコピー回数が減っていると思います。
個人PCでchromeにメモリ食われたりするとコピーが増えて逆転するかもしれないですね。
環境に合わせて変えようと思います。
# 2パス方式(約27秒)
./a.out 25.12s user 1.27s system 99% cpu 26.479 total
# realloc方式(約15秒)
./a.out 12.73s user 1.46s system 99% cpu 14.263 total
-> コピー 1
-> notコピー 636
どなたかの役にたてばと思い僕が調べた内容をお知らせします。
gzip展開後に5GBくらいになるデータでテストしてみました。
@time ./a.outで簡易的に時間取得
Arealloc方式の場合 >>415 の下記部分でコピーが何回発生しているかをカウントしてみる
// アドレスが変化した場合
if( data != data_new ){
// free(data); // 元オブジェクトは解放済みのため不要
data = data_new;
copy +=1; // コピーした回数をカウント
}else{
not_copy +=1; // コピーせずに拡張できた回数をカウント
}
結果は以下のようになりました。
強力なサーバでメモリが潤沢にあるためか、コピーがほとんど発生しないようで
realloc方式が早かったです。
本日祝日でサーバ使用者が少なく、よりコピー回数が減っていると思います。
個人PCでchromeにメモリ食われたりするとコピーが増えて逆転するかもしれないですね。
環境に合わせて変えようと思います。
# 2パス方式(約27秒)
./a.out 25.12s user 1.27s system 99% cpu 26.479 total
# realloc方式(約15秒)
./a.out 12.73s user 1.46s system 99% cpu 14.263 total
-> コピー 1
-> notコピー 636
436デフォルトの名無しさん
2019/08/12(月) 11:33:43.60ID:ejXFqJv3 と言うことは、vectorだと遅くなるんかね
437デフォルトの名無しさん
2019/08/12(月) 12:00:43.69ID:QXujyVaw malloc()されたりrealloc()されたりするヒープメモリは仮想アドレス空間に対応した普通のOSならプロセス毎に別空間だから
他のプロセス(他のサーバ利用者が居る or chrome)があってもヒープメモリの断片化に関係しないはず…
さらに、2パス方式の時間が1パス方式の倍になるのはメモリコピーよりもgzip展開を2回もやることが利いているでケテーイ
他のプロセス(他のサーバ利用者が居る or chrome)があってもヒープメモリの断片化に関係しないはず…
さらに、2パス方式の時間が1パス方式の倍になるのはメモリコピーよりもgzip展開を2回もやることが利いているでケテーイ
438395
2019/08/12(月) 16:26:30.60ID:lzJUIRtk すみません、また疑問が出てきたので相談させてください。
今読み込んだバイナリファイルの解析をしています。
ある一部の8バイトがビッグエンディアン形式で下記になっていて、これが少数点の数値で「2.500000e-04」となるようです。
3e 10 62 4d d2 f1 a9 fc
次に下記URLを参考に調べると今使っているサーバはリトルエンディアンでした。
(CPUはintel)
ttps://qiita.com/ryuichi1208/items/31442f9e8a7a7c94aeec
このため ビックエンディアン→リトルエンディアン の変換が必要と思うので下記のようにしました。
unsigned char t[8];
double little;
for (int i = 0; i < 8; i++) {
t[i] = data[7-i]; // バイトオーダーの変換
printf("%02x ", t[i]);
}
printf("\n");
memcpy(&little, t, 8);
printf(" %e\n", little);
---結果---
fc a9 f1 d2 4d 62 10 3e
9.536743e-10
----------
ちゃんと反転できていますが、結果は期待値「2.500000e-04」ではありませんでした。
>>続きます
今読み込んだバイナリファイルの解析をしています。
ある一部の8バイトがビッグエンディアン形式で下記になっていて、これが少数点の数値で「2.500000e-04」となるようです。
3e 10 62 4d d2 f1 a9 fc
次に下記URLを参考に調べると今使っているサーバはリトルエンディアンでした。
(CPUはintel)
ttps://qiita.com/ryuichi1208/items/31442f9e8a7a7c94aeec
このため ビックエンディアン→リトルエンディアン の変換が必要と思うので下記のようにしました。
unsigned char t[8];
double little;
for (int i = 0; i < 8; i++) {
t[i] = data[7-i]; // バイトオーダーの変換
printf("%02x ", t[i]);
}
printf("\n");
memcpy(&little, t, 8);
printf(" %e\n", little);
---結果---
fc a9 f1 d2 4d 62 10 3e
9.536743e-10
----------
ちゃんと反転できていますが、結果は期待値「2.500000e-04」ではありませんでした。
>>続きます
439395
2019/08/12(月) 16:29:26.29ID:lzJUIRtk 次に実際の値を16進数表示したときの確認として下記を実行したところ、結果は以下のようになりました。
int main(){
double data = 2.500000e-04;
unsigned char *p;
int i;
p = (unsigned char *)&data;
for (i = 0; i < 8; i++) {
printf(" %02X", p[i]);
}
printf("\n");
printf("%e\n", data);
return 1;
}
---結果---
FC A9 F1 D2 4D 62 30 3F
2.500000e-04
----------
比較すると、最初の6バイトは同じですが最後の2バイトが違いました。
どうやったらバイナリデータに入っている 「3e 10 62 4d d2 f1 a9 fc」 を 「2.500000e-04」 に変換できるかわかりますでしょうか?
ビッグエンディアン→リトルエンディアン の変換時にもうひと工夫いるのでしょうか?
int main(){
double data = 2.500000e-04;
unsigned char *p;
int i;
p = (unsigned char *)&data;
for (i = 0; i < 8; i++) {
printf(" %02X", p[i]);
}
printf("\n");
printf("%e\n", data);
return 1;
}
---結果---
FC A9 F1 D2 4D 62 30 3F
2.500000e-04
----------
比較すると、最初の6バイトは同じですが最後の2バイトが違いました。
どうやったらバイナリデータに入っている 「3e 10 62 4d d2 f1 a9 fc」 を 「2.500000e-04」 に変換できるかわかりますでしょうか?
ビッグエンディアン→リトルエンディアン の変換時にもうひと工夫いるのでしょうか?
440デフォルトの名無しさん
2019/08/12(月) 16:44:49.60ID:L6hDiPeu 2.500000e-04のIEEE754表現は3f30624dd2f1a9fcだぞ
元のバイナリの解釈間違ってんだろ
元のバイナリの解釈間違ってんだろ
441デフォルトの名無しさん
2019/08/12(月) 16:54:28.94ID:dO9cEAMi442デフォルトの名無しさん
2019/08/12(月) 16:55:20.98ID:L6hDiPeu 2.500000e-04/9.536743e-10≒262144=2^18だからどっかで誰かが18ビットシフトしてないか調べろ
あとはそのバイナリ作った野郎に聞け
あとはそのバイナリ作った野郎に聞け
443デフォルトの名無しさん
2019/08/12(月) 17:38:07.40ID:ejXFqJv3 decimal64だったりして
サーバのCPUは何?
サーバのCPUは何?
444395
2019/08/12(月) 18:15:44.42ID:lzJUIRtk445デフォルトの名無しさん
2019/08/12(月) 18:17:10.91ID:ejXFqJv3 サーバじゃないか
もとデータ生成したビッグエンディアンのCPUは何かと
もとデータ生成したビッグエンディアンのCPUは何かと
446395
2019/08/12(月) 18:32:01.51ID:lzJUIRtk 同じサーバで生成されました。
生成したソフトは販売されているものなので問題はないと思うし、
他のソフトで読み取ってもちゃんと 2.5e-04 が出てくるのでデータに問題はなさそうです。
なぜそう読めるのか不思議です。。
生成したソフトは販売されているものなので問題はないと思うし、
他のソフトで読み取ってもちゃんと 2.5e-04 が出てくるのでデータに問題はなさそうです。
なぜそう読めるのか不思議です。。
447デフォルトの名無しさん
2019/08/12(月) 18:32:06.77ID:Mc0sgLDk Big Endian だし IBM フォーマットとか?
448デフォルトの名無しさん
2019/08/12(月) 18:34:28.15ID:Mc0sgLDk >>446
> 生成したソフトは販売されているものなので問題はないと思うし、
なぜそのソフトの名前を書かないの?
> 他のソフトで読み取ってもちゃんと 2.5e-04 が出てくるのでデータに問題はなさそうです。
他のソフトって何よ?
みんなエスパーじゃないんだから出せる情報は出しなよ
> 生成したソフトは販売されているものなので問題はないと思うし、
なぜそのソフトの名前を書かないの?
> 他のソフトで読み取ってもちゃんと 2.5e-04 が出てくるのでデータに問題はなさそうです。
他のソフトって何よ?
みんなエスパーじゃないんだから出せる情報は出しなよ
450デフォルトの名無しさん
2019/08/12(月) 19:44:21.64ID:Mc0sgLDk Calmaでググるとこれがヒットするけどこれかな?
https://en.m.wikipedia.org/wiki/Calma
これだとかなり古いソフトウェアだから浮動小数点のフォーマットが違うような気がする
https://en.m.wikipedia.org/wiki/Calma
これだとかなり古いソフトウェアだから浮動小数点のフォーマットが違うような気がする
451395
2019/08/12(月) 21:13:36.45ID:lzJUIRtk452395
2019/08/12(月) 22:32:15.08ID:lzJUIRtk 下記で数値からバイナリへの変換ができましたが、何の計算をしているのかさっぱりわかりません……
逆変換できるのでしょうか?
http://codepad.org/oSvOJP1p
---結果---
変換前の値:0.000250
変換後の値:3e 10 62 4d d2 f1 a9 fc
----------
逆変換できるのでしょうか?
http://codepad.org/oSvOJP1p
---結果---
変換前の値:0.000250
変換後の値:3e 10 62 4d d2 f1 a9 fc
----------
453デフォルトの名無しさん
2019/08/12(月) 22:37:12.67ID:S6a2ieXo454デフォルトの名無しさん
2019/08/12(月) 22:47:45.27ID:ikUKzGwn 浮動小数の正規化っぽいけど
( A < 0.0625 ) || ( A >= 1.0 ) ってのが特殊だと思う
何かそういう事情があったんでしょう
浮動小数の正規化ってのは検索すればわかる
別環境でデコードするだけならたぶん気にしなくて大丈夫
( A < 0.0625 ) || ( A >= 1.0 ) ってのが特殊だと思う
何かそういう事情があったんでしょう
浮動小数の正規化ってのは検索すればわかる
別環境でデコードするだけならたぶん気にしなくて大丈夫
455デフォルトの名無しさん
2019/08/12(月) 22:50:05.37ID:ikUKzGwn 確かに、IBM方式ってやつっぽい
気にしないといかんわw
無駄なこと書いてごめんね
気にしないといかんわw
無駄なこと書いてごめんね
456395
2019/08/12(月) 23:17:08.77ID:lzJUIRtk457デフォルトの名無しさん
2019/08/12(月) 23:30:07.71ID:S6a2ieXo 「エクセス64」とかでググればいいと思うよ
458蟻人間 ◆T6xkBnTXz7B0
2019/08/12(月) 23:30:19.79ID:rRSk3cI0459デフォルトの名無しさん
2019/08/13(火) 10:45:33.34ID:dVadaxxz こんな感じかな?保証はせん
uint64_t ibm = 0x3e10624dd2f1a9fcULL
if (ibm == 0x0) { return 0.0; }
uint64_t sign = ibm >> 63;
uint64_t ibmexp = (ibm >> 56) & 0x7f;
uint64_t ibmfrac = ibm & 0x00ff'ffff'ffff'ffffULL;
if (ibmexp == 0x0) { return std::numeric_limits<double>::quiet_NaN(); } //てきとう
uint64_t ieeeexp = (ibmexp - 64) * 4 + 1023;
uint64_t ieeefrac = ibmfrac;
while(ieeefrac & 0x0100'0000'0000'0000)
{
ieeefrac <<=1;
--ieeeexp;
}
ieeefrac ^= 0x0100'0000'0000'0000;
ieeefrac >>= 1;
uint64_t ieee = (sign << 63) | (ieeeexp << 55) | ieeefrac;
return *reinterpret_cast<double*>(&ieee);
uint64_t ibm = 0x3e10624dd2f1a9fcULL
if (ibm == 0x0) { return 0.0; }
uint64_t sign = ibm >> 63;
uint64_t ibmexp = (ibm >> 56) & 0x7f;
uint64_t ibmfrac = ibm & 0x00ff'ffff'ffff'ffffULL;
if (ibmexp == 0x0) { return std::numeric_limits<double>::quiet_NaN(); } //てきとう
uint64_t ieeeexp = (ibmexp - 64) * 4 + 1023;
uint64_t ieeefrac = ibmfrac;
while(ieeefrac & 0x0100'0000'0000'0000)
{
ieeefrac <<=1;
--ieeeexp;
}
ieeefrac ^= 0x0100'0000'0000'0000;
ieeefrac >>= 1;
uint64_t ieee = (sign << 63) | (ieeeexp << 55) | ieeefrac;
return *reinterpret_cast<double*>(&ieee);
460デフォルトの名無しさん
2019/08/13(火) 14:26:32.23ID:69RK7xLA whileの条件逆じゃね?
461デフォルトの名無しさん
2019/08/13(火) 16:15:58.84ID:dVadaxxz せやなうっかり
462デフォルトの名無しさん
2019/08/13(火) 16:22:35.35ID:dVadaxxz というか指数部のビット長勘違いしてたわ
459は捨ててください恥ずかしい
459は捨ててください恥ずかしい
463デフォルトの名無しさん
2019/08/13(火) 16:47:23.86ID:69RK7xLA ieee形式は自前で変換せずにdoubleで計算してしまえばいいんでは?
464デフォルトの名無しさん
2019/08/13(火) 16:53:18.70ID:dVadaxxz frexpとldexpでやっちゃう方が間違えにくくていいのかな
465デフォルトの名無しさん
2019/08/13(火) 18:22:46.77ID:PZEzWgAr エクセス64か
半導体とかで使われるGDSIIの実数がそれなんだよね。
自力で実装したわー。
4bitを16進数一桁として考えてて、指数部は16^xで表現されててケチ表現なし。
半導体とかで使われるGDSIIの実数がそれなんだよね。
自力で実装したわー。
4bitを16進数一桁として考えてて、指数部は16^xで表現されててケチ表現なし。
466デフォルトの名無しさん
2019/08/13(火) 20:43:52.09ID:qE6XkMY1 じゃあどっかにライブラリでもあるんじゃねえの
探したら出てくるパターンだろこれ
探したら出てくるパターンだろこれ
467デフォルトの名無しさん
2019/08/13(火) 21:21:58.48ID:6RsDp/em >>457-466
コメントやサンプルコードありがとうございます。
こんな複雑なコードになるんですね。。
何やってるのかさっぱりわかりませんが、上記コードを参考に勉強してみます。
しかしエクセス64で検索してもそんなに記事が出てこないですね。
かなりの難易度の予感……
コメントやサンプルコードありがとうございます。
こんな複雑なコードになるんですね。。
何やってるのかさっぱりわかりませんが、上記コードを参考に勉強してみます。
しかしエクセス64で検索してもそんなに記事が出てこないですね。
かなりの難易度の予感……
468デフォルトの名無しさん
2019/08/13(火) 21:38:17.35ID:qE6XkMY1 これか?
GitHub - enthought/ibm2ieee: Cross-project library for converting IBM-format hexadecimal floating-point to IEEE format binary floating-point.
https://github.com/enthought/ibm2ieee
GitHub - enthought/ibm2ieee: Cross-project library for converting IBM-format hexadecimal floating-point to IEEE format binary floating-point.
https://github.com/enthought/ibm2ieee
469デフォルトの名無しさん
2019/08/13(火) 21:49:54.85ID:0//4zuKx よくやった
寝ることを許可する
寝ることを許可する
470デフォルトの名無しさん
2019/08/13(火) 22:00:36.02ID:yoyEPk6p 日本語だと情報が少なかったので英語圏も検索してみたところ、下記を見つけました。
ここのexcess64_to_ieee754が変換できるものかもしれません。
これから調べてみます。
ttps://github.com/ulfgri/gdsii-toolbox/blob/de8deaa5972c1449aacc3eea5dda86472ef721a8/Basic/gdsio/convert_float_generic.h
ここのexcess64_to_ieee754が変換できるものかもしれません。
これから調べてみます。
ttps://github.com/ulfgri/gdsii-toolbox/blob/de8deaa5972c1449aacc3eea5dda86472ef721a8/Basic/gdsio/convert_float_generic.h
472デフォルトの名無しさん
2019/08/13(火) 22:30:02.23ID:b87Bd4Qh473395
2019/08/13(火) 23:33:41.23ID:yoyEPk6p >>472
わかりやすい解説ありがとうございます。
仮数部の計算がまだいまいち理解できていませんが、符号ビットと指数のところは理解できました。
なんとかプログラム作れそうです。
とても勉強になりました。ありがとうございました。
わかりやすい解説ありがとうございます。
仮数部の計算がまだいまいち理解できていませんが、符号ビットと指数のところは理解できました。
なんとかプログラム作れそうです。
とても勉強になりました。ありがとうございました。
474395
2019/08/14(水) 19:36:19.26ID:4qk3klko475デフォルトの名無しさん
2019/08/14(水) 19:42:18.80ID:vrcyV9Lc bit単位でもいいんだけど元の値との対応が取りにくいから16進の1文字(4bitなのでByteじゃなくてNibbleって言う)単位で計算してる
476デフォルトの名無しさん
2019/08/14(水) 20:46:53.70ID:4qk3klko そうでした。4bitでした。
今回バイナリ読みで初めてどっぷり16進数を扱ってますがバイトとニブル?がすぐわからなくなります。。
今回バイナリ読みで初めてどっぷり16進数を扱ってますがバイトとニブル?がすぐわからなくなります。。
477デフォルトの名無しさん
2019/08/15(木) 21:08:05.11ID:ICD/Kw2h バイナリ読み込むだけで大騒ぎだな
478デフォルトの名無しさん
2019/08/15(木) 23:25:44.65ID:ON8CHoCN ttp://www7b.biglobe.ne.jp/~robe/cpphtml/html02/cpp02007.html
上記URLで
・クラスの宣言はヘッダファイルにする
・クラスの実装部はソースファイルにする
・そのクラスを使いたいときはヘッダファイルのみインクルード
とありますが、これが一般的なのでしょうか?
上記URLで
・クラスの宣言はヘッダファイルにする
・クラスの実装部はソースファイルにする
・そのクラスを使いたいときはヘッダファイルのみインクルード
とありますが、これが一般的なのでしょうか?
479デフォルトの名無しさん
2019/08/15(木) 23:28:11.45ID:qONhwHDt テンプレート使ってないならそう
480デフォルトの名無しさん
2019/08/15(木) 23:28:23.18ID:NU+OkurF お前はどうしたいんだ?
481デフォルトの名無しさん
2019/08/15(木) 23:34:39.15ID:ON8CHoCN なるべく基本にのっとった書き方に慣れることで、他の人が書いているプログラムもある程度読めるようになれたら調べるときに助かりそうだと思っています。
482デフォルトの名無しさん
2019/08/16(金) 00:06:45.60ID:rFeA+cBh だからさ、そういう疑問を持つってことは
お前なりに考えた別のやり方があるんだろ?
それを書けよ
お前なりに考えた別のやり方があるんだろ?
それを書けよ
483デフォルトの名無しさん
2019/08/16(金) 06:03:18.56ID:WXGx/ZZ4 イライラしすぎw
484デフォルトの名無しさん
2019/08/16(金) 08:54:32.89ID:obgy5Xre 余裕が無いよね
485デフォルトの名無しさん
2019/08/16(金) 09:25:28.24ID:utjtXV/O 余裕ねえんだよ!
486デフォルトの名無しさん
2019/08/16(金) 12:04:34.47ID:agPg59wH どういう意味や効果があってそうしてるかじゃなくて「一般的」かどうかばかり気にしてるあたりがプログラマ向きの性格じゃなさそう
487デフォルトの名無しさん
2019/08/17(土) 01:32:10.26ID:hKQWaxIk iOSのC++の勉強アプリ何個か試してみたんだけど、未だにC++03時代の事までしか教えてないのね。
でも付属の簡易コンパイラはC++17の機能が使えたりする...
でも付属の簡易コンパイラはC++17の機能が使えたりする...
488デフォルトの名無しさん
2019/08/17(土) 09:28:18.98ID:pwn7XyQd 初心者のうちから shared_ptrやunique_ptr を積極的に使うようにしてほしい。
489デフォルトの名無しさん
2019/08/17(土) 11:16:45.62ID:AIpU/gsR いくら便利なものがあるといってもさすがにC++をナマポや自前RAIIの知識なしで使うのは不可能だから、
初心者は最初はメモリ破壊で苦しんだ方がいいと思うわ
初心者は最初はメモリ破壊で苦しんだ方がいいと思うわ
490デフォルトの名無しさん
2019/08/17(土) 18:58:14.86ID:RHoMoFJP491デフォルトの名無しさん
2019/08/17(土) 19:17:51.68ID:enMhOq0z492デフォルトの名無しさん
2019/08/17(土) 19:24:45.74ID:RHoMoFJP493デフォルトの名無しさん
2019/08/17(土) 20:52:47.23ID:pwn7XyQd マクロは名前空間に閉じ込めることができないからしょうがない
494デフォルトの名無しさん
2019/08/17(土) 21:44:27.19ID:TZKhKhX1 VCはソースを全てBOM付きのutf8にすれば通るんじゃないかな。
495デフォルトの名無しさん
2019/08/18(日) 00:23:19.08ID:rdsOEwya 「一般的」な書き方とは何か
考えざるを得ない流れ
考えざるを得ない流れ
496デフォルトの名無しさん
2019/08/18(日) 01:17:05.19ID:+Tl4M3zk VC使うならForceAllUTF8入れとけ
497デフォルトの名無しさん
2019/08/18(日) 09:44:27.51ID:S9bN8HAf #define 違うなら else
これは もしくは の方がいいんじゃねえか?
これは もしくは の方がいいんじゃねえか?
498デフォルトの名無しさん
2019/08/18(日) 09:51:15.20ID:aqKQgKLg499デフォルトの名無しさん
2019/08/18(日) 10:01:09.98ID:X/aF/qdA >>80
>Pythonは「CPythonの実装が規格だ」だし
それrubyと勘違いしてないか?
明文化されていない仕様なんてそんなに残っていないと思うが。
あと、MATLABはアカデミック分野では少なくともRやOctaveなんかより
信用されていると思うよ。
>Pythonは「CPythonの実装が規格だ」だし
それrubyと勘違いしてないか?
明文化されていない仕様なんてそんなに残っていないと思うが。
あと、MATLABはアカデミック分野では少なくともRやOctaveなんかより
信用されていると思うよ。
500デフォルトの名無しさん
2019/08/18(日) 10:03:59.09ID:X/aF/qdA 間違えて一か月も前のレス付けてしまった///
501デフォルトの名無しさん
2019/08/18(日) 10:49:51.48ID:kvaoi5YP make環境を作ると更新ファイルだけコンパイルしてくれたり、色々便利そうなので
コンパイルコマンド直たたきからmake環境に移行しようと考えています。
下記で正常動作しているので、これでmake環境を作りたいと考えていますが
「c++ make」で検索してもあまり情報がないため苦戦しています。
どのように書けば良いかわかりますか?もしくは参考のURLなどあれば教えていただけないでしょうか。
#!/bin/sh -
export CC=~local/bin/gcc
export CXX=~local/bin/g++
g++ -c -g -Wall -pthread -std=c++11 ./Func.cpp -lm -lz -Wextra -o Func.o &&
g++ -c -g -Wall -pthread -std=c++11 ./Main.cpp -lm -lz -Wextra -o Main.o &&
g++ Main.o Func.o -o main.exe -lz
コンパイルコマンド直たたきからmake環境に移行しようと考えています。
下記で正常動作しているので、これでmake環境を作りたいと考えていますが
「c++ make」で検索してもあまり情報がないため苦戦しています。
どのように書けば良いかわかりますか?もしくは参考のURLなどあれば教えていただけないでしょうか。
#!/bin/sh -
export CC=~local/bin/gcc
export CXX=~local/bin/g++
g++ -c -g -Wall -pthread -std=c++11 ./Func.cpp -lm -lz -Wextra -o Func.o &&
g++ -c -g -Wall -pthread -std=c++11 ./Main.cpp -lm -lz -Wextra -o Main.o &&
g++ Main.o Func.o -o main.exe -lz
502デフォルトの名無しさん
2019/08/18(日) 10:59:16.60ID:ToM84NKx 正常動作してんだったらそれでいいじゃん
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 高市首相の答弁書に「台湾有事答えない」と明記 存立危機発言当時 ★2 [蚤の市★]
- 米大統領報道官「日本と強固な同盟維持、中国とも協力」 [少考さん★]
- JA全農が「新おこめ券」…来年9月末の有効期限を新設、必要経費のみ上乗せ ★2 [蚤の市★]
- ミス・ユニバース フィンランド代表の「つり目」写真が波紋… 本人釈明も批判やまず 協会謝罪「徹底的に検証」へ [冬月記者★]
- 1人3千円の食品高騰対策、何に使える? あいまいなまま衆院通過 [蚤の市★]
- 【テレビ】粗品「THE W」バッサリ「おもんない、レベル低い」審査員就任で「日テレが“血の海”に…」 [湛然★]
- 死にてえやつこい
- 立憲民主党を支持している人たちって何を思って支持しているの?
- 【朗報】アメリカ、貿易赤字が市場予想を超える大幅縮小WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
- 【東京新聞】「偽サッチャー」「自滅的」「時代遅れ」高市首相の経済政策を海外メディアが酷評www [718678614]
- 【悲報】維新の政治資金でガールズバー、高市首相「良いか悪いかは国民の皆さまが判断されること」 [115996789]
- 中国人、ガチ超正論。「日本人がアイヌに対してやったことを『問題ない』とするなら、中国が日本人に同じことをしても文句ないだろう?」 [314039747]
