!extend:checked:vvvvv:1000:512
(新スレ立ての際上記コマンドを2行書き込んでください)
C言語の話題のみ取り扱います C++の話題はC++スレへ
質問には最低限の情報(ソース/コンパイラ/OS)を付ける
数行で収まらないソースは以下を適当に使ってURLを晒す
https://paiza.io/
https://ideone.com/
http://codepad.org/
C11
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1570.pdf
C99
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf
http://kikakurui.com/x3/X3010-2003-01.html
C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/
JPCERT C コーディングスタンダード
https://www.jpcert.or.jp/sc-rules/
※前スレ
C言語なら俺に聞け 153
https://mevius.5ch.net/test/read.cgi/tech/1566050562/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
C言語なら俺に聞け 154
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ワッチョイ bf63-lB9F)
2020/01/14(火) 19:32:30.16ID:SgRnb4BR0229デフォルトの名無しさん (ブーイモ MM0a-Ftjm)
2020/02/02(日) 12:32:50.80ID:VB3p6sP1M230デフォルトの名無しさん (ワッチョイ 39d2-fhCF)
2020/02/02(日) 12:37:44.03ID:w7N5c9rM0 そもそもお金に0.1円とかないから四捨五入は必要ない
231デフォルトの名無しさん (ワッチョイ a612-i7CI)
2020/02/02(日) 12:43:11.07ID:SWo7Ruqh0 固定か浮動かって問題じゃない
10進の0.1が2進では0.00011001100110011001100110011...という循環小数になり
金の話では出てこないはずの誤差が出るって話だ
最小単位が1円のときは10銭、10銭のときは1銭が2進演算では正しく扱えない
最小単位をいくらにしても同じことというのをキリがないと言ったんだ
10進の0.1が2進では0.00011001100110011001100110011...という循環小数になり
金の話では出てこないはずの誤差が出るって話だ
最小単位が1円のときは10銭、10銭のときは1銭が2進演算では正しく扱えない
最小単位をいくらにしても同じことというのをキリがないと言ったんだ
232デフォルトの名無しさん (ブーイモ MM0a-Ftjm)
2020/02/02(日) 12:46:55.96ID:VB3p6sP1M >>231
最小単位以下の誤差なんて累乗計算でも出るじゃん
最小単位以下の誤差なんて累乗計算でも出るじゃん
233デフォルトの名無しさん (ワッチョイ a612-i7CI)
2020/02/02(日) 12:48:44.37ID:SWo7Ruqh0 >>230
\1,000,500_に源泉税率10.21%を掛けたらいくらになる?
\1,000,500_に源泉税率10.21%を掛けたらいくらになる?
234デフォルトの名無しさん (ワッチョイ a612-i7CI)
2020/02/02(日) 12:49:20.92ID:SWo7Ruqh0 >>232
誤差の出方が10進と2進では違うって話
誤差の出方が10進と2進では違うって話
235デフォルトの名無しさん (ワッチョイ 39d2-fhCF)
2020/02/02(日) 12:51:06.34ID:w7N5c9rM0 誤差がでてもそれよりすごく大きい数で四捨五入するんだから同じだろ
236デフォルトの名無しさん (ブーイモ MM0a-Ftjm)
2020/02/02(日) 12:51:15.29ID:VB3p6sP1M237デフォルトの名無しさん (ワッチョイ ea2c-KoMo)
2020/02/02(日) 12:56:31.50ID:ceem9FS20 10進数では、1/3 が循環小数で、
2進数では、1/10 が循環小数って、言うだけ!
2進数では、1/10 が循環小数って、言うだけ!
238デフォルトの名無しさん (ワッチョイ a612-i7CI)
2020/02/02(日) 12:59:27.07ID:SWo7Ruqh0239デフォルトの名無しさん (ワッチョイ 39d2-fhCF)
2020/02/02(日) 13:00:47.13ID:w7N5c9rM0 10進数で手動で計算するときと同じ誤差のでかたじゃないと駄目なんじゃないか?
240デフォルトの名無しさん (ワッチョイ 39d2-fhCF)
2020/02/02(日) 13:04:59.05ID:w7N5c9rM0 問題なのは四捨五入じゃなくて
2進数だと0.1が表示できないってことじゃないのか?
10進数なら0.1から0.9まで全部表示できるけど
2進数だと0.1が表示できないってことじゃないのか?
10進数なら0.1から0.9まで全部表示できるけど
241デフォルトの名無しさん (ワッチョイ ea02-L01+)
2020/02/02(日) 13:28:12.47ID:OL0mFBDc0 計算機イプシロンでいいだろもう
今回の低レベルの諍いについてvoid君はどう思う?
今回の低レベルの諍いについてvoid君はどう思う?
242デフォルトの名無しさん (ワッチョイ 89b3-x67y)
2020/02/02(日) 13:32:17.04ID:D8WvcGqJ0243デフォルトの名無しさん (ワッチョイ 89b3-x67y)
2020/02/02(日) 13:34:11.48ID:D8WvcGqJ0 100万円を利息年3%で借りた時
1年で利息はいくら?
1年で利息はいくら?
244デフォルトの名無しさん (ワッチョイ 7dda-unxX)
2020/02/02(日) 13:39:19.37ID:Wawdq7250 そんなもんどんな返し方をするかがわからんと解析解さえ出ない
>>227
その場合、小数点以下N桁目、あるいは余裕をみて N+4桁目くらいを考えて
10^(N+4) 倍して整数1 と内部表現 10^(N+4) を一対一対応とすれば整合性はとれるのでは?(これを固定小数点といいます)
その場合、小数点以下N桁目、あるいは余裕をみて N+4桁目くらいを考えて
10^(N+4) 倍して整数1 と内部表現 10^(N+4) を一対一対応とすれば整合性はとれるのでは?(これを固定小数点といいます)
>>231
10進の1 の内部表現を 10, 10進の2 の内部表現を 20, 10進の3 の内部表現を 30 …、10進の0.1 の内部表現を 1
という固定小数点にすれば、 お金の計算のような演算では十分なのでは?
10進の1 の内部表現を 10, 10進の2 の内部表現を 20, 10進の3 の内部表現を 30 …、10進の0.1 の内部表現を 1
という固定小数点にすれば、 お金の計算のような演算では十分なのでは?
>>242
まあ五捨五入というのは、よそではあまり聞かないですね
まあ五捨五入というのは、よそではあまり聞かないですね
249デフォルトの名無しさん (スッップ Sd0a-x67y)
2020/02/02(日) 13:56:18.00ID:gkoi3ncld 値を保持するだけなら何でも良いよ
保持出来るだけの精度が有れば
固定小数点だろうが整数部と小数部だろうが
10進浮動小数点だろうが
BCD整数だろうが
計算の方法、式、丸め方が特殊で
途中の型も特殊だったりする
これに多くの評価が必要
だから
結果の型だけを語るのはトンチンカン
保持出来るだけの精度が有れば
固定小数点だろうが整数部と小数部だろうが
10進浮動小数点だろうが
BCD整数だろうが
計算の方法、式、丸め方が特殊で
途中の型も特殊だったりする
これに多くの評価が必要
だから
結果の型だけを語るのはトンチンカン
250デフォルトの名無しさん (ワッチョイ 7d4f-unxX)
2020/02/02(日) 14:01:47.01ID:nz0OxFB30 >>246
一回計算する毎にいちいち2進に戻すのにそんな手間かけるより10進演算器用意する方が効率的ということ
一回計算する毎にいちいち2進に戻すのにそんな手間かけるより10進演算器用意する方が効率的ということ
251デフォルトの名無しさん (スッップ Sd0a-x67y)
2020/02/02(日) 14:06:26.86ID:gkoi3ncld 手間とか効率とかの問題じゃなくて
値の一貫性の問題
最終的に得る値が整数だとしても
途中の計算精度や丸め方によって誤差が微妙に異なり
結果1円の誤差になりました
じゃダメなの
値の一貫性の問題
最終的に得る値が整数だとしても
途中の計算精度や丸め方によって誤差が微妙に異なり
結果1円の誤差になりました
じゃダメなの
252デフォルトの名無しさん (ブーイモ MM0a-Ftjm)
2020/02/02(日) 14:11:34.03ID:VB3p6sP1M >>238
あんたの言う誤差とは何かね?
あんたの言う誤差とは何かね?
253デフォルトの名無しさん (スッップ Sd0a-x67y)
2020/02/02(日) 14:12:15.30ID:gkoi3ncld 途中の計算精度があれば良いってわけじゃない
100桁精度でも無限精度でもダメ
決まってるロジック通りの結果を返さなきゃダメ
数値計算と思わない方が良いかも
100桁精度でも無限精度でもダメ
決まってるロジック通りの結果を返さなきゃダメ
数値計算と思わない方が良いかも
254デフォルトの名無しさん (スッップ Sd0a-x67y)
2020/02/02(日) 14:14:53.67ID:gkoi3ncld 決められてる通りのロジックで返した時の値との差が誤差
誤差は一切許されない
これがお金の計算
誤差は一切許されない
これがお金の計算
255デフォルトの名無しさん (スッップ Sd0a-x67y)
2020/02/02(日) 14:17:09.96ID:gkoi3ncld オンラインゲームも一貫性が必要だったりする
対戦相手と結果が異なってはまずいので
そういう部分では
厳密にCPUでもGPUでも同じ値である必要かある
対戦相手と結果が異なってはまずいので
そういう部分では
厳密にCPUでもGPUでも同じ値である必要かある
256デフォルトの名無しさん (ワッチョイ 39d2-fhCF)
2020/02/02(日) 14:17:57.04ID:w7N5c9rM0 わかったぞ
十進数だと0.5円になるときには四捨五入すると1円になるけど
2進数の時0.4999999999円みたいになった時0円になっちゃうってこと?
十進数だと0.5円になるときには四捨五入すると1円になるけど
2進数の時0.4999999999円みたいになった時0円になっちゃうってこと?
257デフォルトの名無しさん (ワッチョイ 39d2-fhCF)
2020/02/02(日) 14:20:40.80ID:w7N5c9rM0 0.1円の誤差をなくすために0.1円以上掛けたら意味なくない?
258デフォルトの名無しさん (スッップ Sd0a-x67y)
2020/02/02(日) 14:23:22.92ID:gkoi3ncld 1円でも誤差があると帰れない銀行員の話とか知らない?
259デフォルトの名無しさん (ワッチョイ 39d2-fhCF)
2020/02/02(日) 14:24:38.04ID:w7N5c9rM0 日本が異常なだけでしょ?
アメリカとかだと1円払って終わりじゃね?
アメリカとかだと1円払って終わりじゃね?
260デフォルトの名無しさん (スッップ Sd0a-x67y)
2020/02/02(日) 14:30:28.56ID:gkoi3ncld 私が直接話を聞いたのは外資系の銀行員から
261デフォルトの名無しさん (ワッチョイ 7dda-unxX)
2020/02/02(日) 14:32:20.39ID:Wawdq7250 つまり
10進で計算するのは,10進で計算せよというロジックがあるからであって,循環小数を避けるためではない
ということか
そういうことなら誰も文句ないんじゃね?
10進で計算するのは,10進で計算せよというロジックがあるからであって,循環小数を避けるためではない
ということか
そういうことなら誰も文句ないんじゃね?
262デフォルトの名無しさん (ワッチョイ b501-0Ybi)
2020/02/02(日) 14:37:37.76ID:mzCY/+E00 https://ideone.com/HdUvEa
こういうことでは。
こういうことでは。
263デフォルトの名無しさん (ワッチョイ ea2c-KoMo)
2020/02/02(日) 14:44:42.42ID:ceem9FS20 >>256
0.5 は、2進数の1/2 だから、割り切れる。
0.25 は、2進数の1/4 だから、割り切れる
だから、0.5 + 0.25 = 0.75 も、2進数で割り切れる
でも、0.1 は循環小数になるから、
0.1 * 5 != 0.5
これは不一致!
情報処理の初級資格の内容w
これを勉強していない人は、プロじゃない!
つまり、お金の計算では、誤差のある浮動小数点演算は使えない!
Decimal を使う
0.5 は、2進数の1/2 だから、割り切れる。
0.25 は、2進数の1/4 だから、割り切れる
だから、0.5 + 0.25 = 0.75 も、2進数で割り切れる
でも、0.1 は循環小数になるから、
0.1 * 5 != 0.5
これは不一致!
情報処理の初級資格の内容w
これを勉強していない人は、プロじゃない!
つまり、お金の計算では、誤差のある浮動小数点演算は使えない!
Decimal を使う
264デフォルトの名無しさん (ワッチョイ b501-0Ybi)
2020/02/02(日) 14:48:07.68ID:mzCY/+E00 もういいわ。
おまえ等のプログラムじゃ金の計算できないわ。
エクセル使う。
おまえ等のプログラムじゃ金の計算できないわ。
エクセル使う。
265デフォルトの名無しさん (ワッチョイ 2a63-unxX)
2020/02/02(日) 14:48:39.82ID:lNG3EL+m0 三人で三等分して、構成比を%で表示しろと言われ、
何も考えずに計算結果出して見せたら、
合計が100%になってないと文句を言われたw
何も考えずに計算結果出して見せたら、
合計が100%になってないと文句を言われたw
266デフォルトの名無しさん (ワッチョイ b501-0Ybi)
2020/02/02(日) 15:07:37.05ID:mzCY/+E00 一番上のお姉ちゃんがプリン食べれないやつか。
>>250
>一回計算する毎にいちいち2進に戻すのにそんな手間かけるより10進演算器用意する方が効率的ということ
いいえ、値の保持と計算はずっと 2 進+固定小数点のままで行い、人間に値を見せるときにはじめて 2 進→ 10 進変換を実施します
>途中の計算精度や丸め方によって誤差が微妙に異なり
お金の計算における丸め方法の規則は、四捨五入にしても五捨五入にしても 10 進法整数に親和的なのだから、多桁長表現+固定小数点で表現すればかなり厳密に扱えるとおもいますよ
>一回計算する毎にいちいち2進に戻すのにそんな手間かけるより10進演算器用意する方が効率的ということ
いいえ、値の保持と計算はずっと 2 進+固定小数点のままで行い、人間に値を見せるときにはじめて 2 進→ 10 進変換を実施します
>途中の計算精度や丸め方によって誤差が微妙に異なり
お金の計算における丸め方法の規則は、四捨五入にしても五捨五入にしても 10 進法整数に親和的なのだから、多桁長表現+固定小数点で表現すればかなり厳密に扱えるとおもいますよ
>>263
>Decimal を使う
Decimal の内部表現方法に興味がありますね、まさか、今でも BCD だとは思えませんが(x86_AMD64 でも関連ニーモニックは消えました)、もしかして?!
>Decimal を使う
Decimal の内部表現方法に興味がありますね、まさか、今でも BCD だとは思えませんが(x86_AMD64 でも関連ニーモニックは消えました)、もしかして?!
269デフォルトの名無しさん (ワッチョイ 39d2-fhCF)
2020/02/02(日) 15:19:29.78ID:w7N5c9rM0 小数点の位置と整数の2つの情報で10進数の少数は誤差なくあらわせるよ
270デフォルトの名無しさん (ワッチョイ b501-0Ybi)
2020/02/02(日) 15:22:25.38ID:mzCY/+E00 >>269
どうやるんだよ。
どうやるんだよ。
271デフォルトの名無しさん (ワッチョイ 7d4f-unxX)
2020/02/02(日) 15:27:54.74ID:nz0OxFB30 >>267
丸めは計算ごとに適用されるんだよ、馬鹿。
丸めは計算ごとに適用されるんだよ、馬鹿。
272デフォルトの名無しさん (ワッチョイ 39d2-fhCF)
2020/02/02(日) 15:30:01.89ID:w7N5c9rM0 >>270
0.1は1番目に点がある1だから1と1で表せる
0.1は1番目に点がある1だから1と1で表せる
273デフォルトの名無しさん (ワッチョイ 39d2-fhCF)
2020/02/02(日) 15:36:23.54ID:w7N5c9rM0 少数点以下の整数と小数点以上の整数でも表せる
274デフォルトの名無しさん (ブーイモ MMc9-AfBq)
2020/02/02(日) 15:38:49.63ID:anvSpfnfM 機械語なら商と剰余はたいていいっぺんに計算できるけど、Cからそれらの機械語が使われると期待していい書き方ってどうすればいい?
10年来の疑問
10年来の疑問
275デフォルトの名無しさん (ワッチョイ 39d2-fhCF)
2020/02/02(日) 15:40:29.20ID:w7N5c9rM0 Cのライブラリーにいっぺんに計算されるやつがある
276デフォルトの名無しさん (ワッチョイ 2a63-unxX)
2020/02/02(日) 15:42:13.13ID:lNG3EL+m0 小数と少数を間違えないで
>>267
>>いいえ、値の保持と計算はずっと 2 進+固定小数点のままで行い、人間に値を見せるときにはじめて 2 進→ 10 進変換を実施します
>>271
>丸めは計算ごとに適用されるんだよ、馬鹿。
そうか、確かに私にも落ち度がありました、2進整数+固定小数点ならば、丸める桁まで 10 で割り続けて余りを求める必要がありますね、これはほとんど2進→10進変換といっていいですね
しかし、全桁を 2進→10進する必要はなく、丸める桁までで 2 進→ 10 進するだけでいい
x86-AMD64 では 8086 時代の BCD 補正命令は全部なくなってしまったことから考えても、「Decimal」型は整数+小数点位置なんじゃないかな…
>>いいえ、値の保持と計算はずっと 2 進+固定小数点のままで行い、人間に値を見せるときにはじめて 2 進→ 10 進変換を実施します
>>271
>丸めは計算ごとに適用されるんだよ、馬鹿。
そうか、確かに私にも落ち度がありました、2進整数+固定小数点ならば、丸める桁まで 10 で割り続けて余りを求める必要がありますね、これはほとんど2進→10進変換といっていいですね
しかし、全桁を 2進→10進する必要はなく、丸める桁までで 2 進→ 10 進するだけでいい
x86-AMD64 では 8086 時代の BCD 補正命令は全部なくなってしまったことから考えても、「Decimal」型は整数+小数点位置なんじゃないかな…
278デフォルトの名無しさん (ワッチョイ a612-i7CI)
2020/02/02(日) 16:00:27.23ID:SWo7Ruqh0279デフォルトの名無しさん (ブーイモ MMc9-AfBq)
2020/02/02(日) 16:24:08.92ID:VqF3mFhWM >>275
ポータブルなやつを頼む
ポータブルなやつを頼む
280デフォルトの名無しさん (ワッチョイ 39d2-fhCF)
2020/02/02(日) 16:27:09.95ID:w7N5c9rM0 >>279
標準ライブラリーだからポータブル
標準ライブラリーだからポータブル
281デフォルトの名無しさん (スッップ Sd0a-x67y)
2020/02/02(日) 16:40:10.12ID:gkoi3ncld >>277
IEEE754にも10進数があるから見てみれば
IEEE754にも10進数があるから見てみれば
282デフォルトの名無しさん (ブーイモ MM0a-Ftjm)
2020/02/02(日) 16:50:09.63ID:VB3p6sP1M283デフォルトの名無しさん (ワッチョイ a612-i7CI)
2020/02/02(日) 17:00:29.36ID:SWo7Ruqh0284デフォルトの名無しさん (ワッチョイ 2a63-unxX)
2020/02/02(日) 17:03:20.75ID:lNG3EL+m0 円周率は概ね3です
285デフォルトの名無しさん (ブーイモ MM0a-Ftjm)
2020/02/02(日) 17:20:36.09ID:VB3p6sP1M >>283
あんたの言ってる誤差は循環小数云々の誤差ということでいいのか?
あんたの言ってる誤差は循環小数云々の誤差ということでいいのか?
286デフォルトの名無しさん (ワッチョイ 1163-6LpL)
2020/02/02(日) 17:52:51.69ID:8cBiUpXt0 盛り上がってるなー。
が、なんか思ったのと違う進行。。
が、なんか思ったのと違う進行。。
287デフォルトの名無しさん (ワッチョイ 2a63-unxX)
2020/02/02(日) 18:01:39.53ID:lNG3EL+m0288デフォルトの名無しさん (ワッチョイ 6aa5-OeZ9)
2020/02/02(日) 19:18:27.60ID:825maVGz0 >>219
そりゃーC言語よりも古いCOBOLがあるもん
銀行案件は全部そっち任せだろ
だからそういうライブラリを発達させる必要が無かった
COBOL最盛期がいつかは知らんがきっとIBM最高益の時代あたりだろ
そりゃーC言語よりも古いCOBOLがあるもん
銀行案件は全部そっち任せだろ
だからそういうライブラリを発達させる必要が無かった
COBOL最盛期がいつかは知らんがきっとIBM最高益の時代あたりだろ
289デフォルトの名無しさん (ワッチョイ 8a1e-7ddI)
2020/02/02(日) 20:44:43.11ID:F6yWVrL10 >>274
普通に書けば最適化してくれる場合もある。
とりあえず gcc -O2 とやってみた。
extern int w,x,y,z;
void foo( void) {
y = w / x;
z = w % x;
}
int bar( int x,int y){ return x / y + x % y;}
普通に書けば最適化してくれる場合もある。
とりあえず gcc -O2 とやってみた。
extern int w,x,y,z;
void foo( void) {
y = w / x;
z = w % x;
}
int bar( int x,int y){ return x / y + x % y;}
290デフォルトの名無しさん (スッップ Sd0a-x67y)
2020/02/02(日) 20:51:51.61ID:gkoi3ncld 割り算は遅い
スーパーコンピュータでも遅い
定数の割り算で済む所は定数に
並列化可能ならSIMD命令で複数一気に
スーパーコンピュータでも遅い
定数の割り算で済む所は定数に
並列化可能ならSIMD命令で複数一気に
291デフォルトの名無しさん (ワッチョイ a612-i7CI)
2020/02/02(日) 20:55:57.98ID:SWo7Ruqh0 >>285
まあそういうことだ
おまえさんにとっての関心事に関係するかどうかは知らん
さっき言ったとおり、俺は保育士じゃないんで他人ん家の坊ちゃん嬢ちゃんは扱えない
プラレールだかリカちゃんだかの相手はしてられない
まあそういうことだ
おまえさんにとっての関心事に関係するかどうかは知らん
さっき言ったとおり、俺は保育士じゃないんで他人ん家の坊ちゃん嬢ちゃんは扱えない
プラレールだかリカちゃんだかの相手はしてられない
292デフォルトの名無しさん (ワッチョイ a612-i7CI)
2020/02/02(日) 20:57:05.76ID:SWo7Ruqh0293デフォルトの名無しさん (スッップ Sd0a-x67y)
2020/02/02(日) 23:53:32.36ID:gkoi3ncld タンジェントもべき乗も遅いけど
使う頻度的には割り算より圧倒的に少ないし
見るからに遅そうだから気を付けるだろう
割り算や余りは手軽に使いがちで遅い
例えばSkylakeでは加減乗算の100倍くらいかかる
割り算と余り両方使うなら
以下のように書いた方が良い
c=a/b;
d=a-c*b;
除算命令を2回呼ぶことはなくなるし
bが定数なら乗算に置き換えてくれる
ライブラリだとbが定数でも除算命令を使ってしまうと思う
使う頻度的には割り算より圧倒的に少ないし
見るからに遅そうだから気を付けるだろう
割り算や余りは手軽に使いがちで遅い
例えばSkylakeでは加減乗算の100倍くらいかかる
割り算と余り両方使うなら
以下のように書いた方が良い
c=a/b;
d=a-c*b;
除算命令を2回呼ぶことはなくなるし
bが定数なら乗算に置き換えてくれる
ライブラリだとbが定数でも除算命令を使ってしまうと思う
294デフォルトの名無しさん (ワッチョイ ea79-/fp1)
2020/02/03(月) 07:43:30.26ID:0n0692Cx0 除算が遅いってのは常識だな
浮動小数点数演算の話だが2回以上同じ数で割るなら逆数を取っておいてそれを掛けろと習ったわ
そもそも浮動小数点数演算が圧倒的に遅いから可能な限り整数型で済ませろとも
浮動小数点数演算の話だが2回以上同じ数で割るなら逆数を取っておいてそれを掛けろと習ったわ
そもそも浮動小数点数演算が圧倒的に遅いから可能な限り整数型で済ませろとも
295デフォルトの名無しさん (アウアウクー MM7d-2G11)
2020/02/03(月) 08:16:49.22ID:vFO4eQ5PM どこでそんなこと習うんだ…
296デフォルトの名無しさん (ワッチョイ 89b3-x67y)
2020/02/03(月) 08:20:37.59ID:e9E2NTEb0 浮動小数点が圧倒的に遅いかどうかはCPU次第
PCなら速いし
CPUに命令がなければソフトウェア実装になるので遅い
この場合、当然floatよりdoubleの方が遅い
(floatもdoubleも32bitの環境もあるけど)
浮動小数点の割り算は
定数であれば1個でも逆数をかける方が良い
x / [定数] と x * (1.0/[定数])
で値が異なることがあるため、最適化してくれない場合がある
PCなら速いし
CPUに命令がなければソフトウェア実装になるので遅い
この場合、当然floatよりdoubleの方が遅い
(floatもdoubleも32bitの環境もあるけど)
浮動小数点の割り算は
定数であれば1個でも逆数をかける方が良い
x / [定数] と x * (1.0/[定数])
で値が異なることがあるため、最適化してくれない場合がある
297デフォルトの名無しさん (ワッチョイ 39d2-fhCF)
2020/02/03(月) 08:22:21.52ID:m5kUFkC70 割り算と余りを一回で計算できる命令がCPUにはあるのよ
298デフォルトの名無しさん (ワッチョイ 89b3-x67y)
2020/02/03(月) 08:27:41.12ID:e9E2NTEb0299デフォルトの名無しさん (ワッチョイ 39d2-fhCF)
2020/02/03(月) 08:36:20.54ID:m5kUFkC70 割り算が100倍掛かるって嘘じゃない?
調べたら掛け算より少し遅いくらいだけみたいだけど
調べたら掛け算より少し遅いくらいだけみたいだけど
300デフォルトの名無しさん (ブーイモ MMc9-BGKF)
2020/02/03(月) 09:47:15.11ID:x3IhE4UHM 浮動小数点の除算はニュートン法使うからそれほど遅くない。乗算の数倍程度。
整数の除算は基本的に高速化できないのでだいぶ遅い。
整数でも定数で除算すると逆数の乗算プラス補正で実装されるので速い。
アセンブリ出させて見てみるべし。
整数の除算は基本的に高速化できないのでだいぶ遅い。
整数でも定数で除算すると逆数の乗算プラス補正で実装されるので速い。
アセンブリ出させて見てみるべし。
301デフォルトの名無しさん (ワッチョイ 39d2-fhCF)
2020/02/03(月) 11:19:33.45ID:m5kUFkC70302デフォルトの名無しさん (スッップ Sd0a-x67y)
2020/02/03(月) 12:43:23.75ID:jOrmfTQLd instlatx64でSkylakeの64bit命令の
スループットを見ると
IDIVはフルビットで95クロック
ADDは0.33, IMULは1クロック
AVX命令だと乗算や積和も0.5クロック
遅くて使われなくなったFSINが130クロックだから
遅さがわかると思う
コンパイラはなるべくこの命令を使わないで済むように
また使う回数をなるべく減らすよう工夫するんだけど
標準ライブラリの場合はIDIVを無条件で使ってしまう
スループットを見ると
IDIVはフルビットで95クロック
ADDは0.33, IMULは1クロック
AVX命令だと乗算や積和も0.5クロック
遅くて使われなくなったFSINが130クロックだから
遅さがわかると思う
コンパイラはなるべくこの命令を使わないで済むように
また使う回数をなるべく減らすよう工夫するんだけど
標準ライブラリの場合はIDIVを無条件で使ってしまう
303デフォルトの名無しさん (スッップ Sd0a-x67y)
2020/02/03(月) 12:49:05.54ID:jOrmfTQLd 浮動小数点だと差はちょっと縮まる
加減乗算と積和は0.5クロック
除算は倍精度スカラーで4クロック、ベクタで8クロック
倍精度浮動小数点の積和演算が4個同時に出来る命令が
毎クロック2個ずつ実行出来るのに
ただの整数除算1個が95クロックもかかる
遅さがわかるでしょ?
加減乗算と積和は0.5クロック
除算は倍精度スカラーで4クロック、ベクタで8クロック
倍精度浮動小数点の積和演算が4個同時に出来る命令が
毎クロック2個ずつ実行出来るのに
ただの整数除算1個が95クロックもかかる
遅さがわかるでしょ?
304デフォルトの名無しさん (ワッチョイ 39d2-fhCF)
2020/02/03(月) 12:52:56.44ID:m5kUFkC70 100倍掛かるなら100倍時間掛かるはずでしょ
そんなわけ無いじゃん
そんなわけ無いじゃん
305デフォルトの名無しさん (アウウィフ FF21-0Ybi)
2020/02/03(月) 13:50:54.22ID:62FLJlSTF パイプラインですね判りますω
306デフォルトの名無しさん (ワッチョイ a612-i7CI)
2020/02/03(月) 15:12:48.45ID:TXSv3nXz0 除算器をパイプライン化することで
スループットは上げられても
レイテンシは変わらないかんな
スループットは上げられても
レイテンシは変わらないかんな
307デフォルトの名無しさん (ワッチョイ 2a63-unxX)
2020/02/03(月) 15:14:45.18ID:XXjF7BB80 予測で
308デフォルトの名無しさん (ワッチョイ 5d35-MzNC)
2020/02/04(火) 01:59:00.38ID:SgzhJHen0 今どき役に立つ場面は少ないけどこういうの楽しいな
309デフォルトの名無しさん (ワッチョイ 7d01-0Ybi)
2020/02/04(火) 06:57:32.95ID:j6eziqdx0 以下のプログラムのb_testにはなぜ0x3322ではなく、0x4433が代入されるのでしょうか?
#include <stdio.h>
typedef struct
{
unsigned char a;
unsigned short b;
} TEST_2;
int main(void)
{
unsigned char bytes[] = { 0x11, 0x22, 0x33, 0x44 };
TEST_2* pMemoryDevice = (TEST_2*)bytes;
unsigned char a_test = pMemoryDevice->a;
unsigned short b_test = pMemoryDevice->b;
printf("0x%X\n", b_test);
return 0;
}
#include <stdio.h>
typedef struct
{
unsigned char a;
unsigned short b;
} TEST_2;
int main(void)
{
unsigned char bytes[] = { 0x11, 0x22, 0x33, 0x44 };
TEST_2* pMemoryDevice = (TEST_2*)bytes;
unsigned char a_test = pMemoryDevice->a;
unsigned short b_test = pMemoryDevice->b;
printf("0x%X\n", b_test);
return 0;
}
310デフォルトの名無しさん (ワッチョイ 151a-unxX)
2020/02/04(火) 07:04:32.35ID:/MaewKoE0 >>309
aliasing rule 違反やアライメント違反の可能性などにより未定義動作なので 0x4433 になるとも限りません。
対象の環境を限定して何が起こっているか知りたいならアセンブリを出力してみるのがいいと思います。
aliasing rule 違反やアライメント違反の可能性などにより未定義動作なので 0x4433 になるとも限りません。
対象の環境を限定して何が起こっているか知りたいならアセンブリを出力してみるのがいいと思います。
311デフォルトの名無しさん (ワッチョイ 7d01-0Ybi)
2020/02/04(火) 07:14:24.84ID:j6eziqdx0 >>310
アセンブリ出力してみてみたんですが、そもそもなぜそのようになるのかが疑問です。
この場合、"0x11"がBYTE, "0x22, 0x33"がWORDのバイト配列を構造体で表したい場合どうすればいいのでしょうか?
アセンブリ出力してみてみたんですが、そもそもなぜそのようになるのかが疑問です。
この場合、"0x11"がBYTE, "0x22, 0x33"がWORDのバイト配列を構造体で表したい場合どうすればいいのでしょうか?
312デフォルトの名無しさん (ワッチョイ 89b3-x67y)
2020/02/04(火) 07:36:55.76ID:CGekWIL20 bは2バイトだから2バイト境界になるように詰め物をした
コンパイラやCPUの仕様
コンパイラやCPUの仕様
313デフォルトの名無しさん (ワッチョイ 89b3-x67y)
2020/02/04(火) 07:38:21.05ID:CGekWIL20 環境依存
#pragma pack とかコンパイルオプションで
変えられたりする
#pragma pack とかコンパイルオプションで
変えられたりする
314デフォルトの名無しさん (ワッチョイ e5f9-/fp1)
2020/02/04(火) 07:49:06.50ID:QC3PzamG0315デフォルトの名無しさん (ワッチョイ 7d01-0Ybi)
2020/02/04(火) 08:03:48.58ID:j6eziqdx0 #pragma pack(1)を使うことによって解決しました!
ありがとうございます。
今まで結構バイト配列を構造体に割り当てるってことをしてきましたが、気づきませんでした、、
ありがとうございます。
今まで結構バイト配列を構造体に割り当てるってことをしてきましたが、気づきませんでした、、
316デフォルトの名無しさん (ブーイモ MMc9-BGKF)
2020/02/04(火) 09:27:02.59ID:rp8heKByM できるかできないかアーキテクチャ環境依存だし、
できても遅くなる可能性もあるので注意
できても遅くなる可能性もあるので注意
317デフォルトの名無しさん (スッップ Sd0a-x67y)
2020/02/04(火) 12:50:10.02ID:GNpMFwh2d そもそもunsigned charの配列をキャストしてる時点で
318デフォルトの名無しさん (ワッチョイ a612-i7CI)
2020/02/04(火) 13:04:48.75ID:6srsz/DQ0 unsigned charの配列をキャストしてる時点で何?
309は構造体の性質を調べる実験をしていて
そのために普段しないことをわざとやってるんだが
309は構造体の性質を調べる実験をしていて
そのために普段しないことをわざとやってるんだが
319デフォルトの名無しさん (アウアウウー Sa21-lBRq)
2020/02/04(火) 15:53:52.78ID:MHG3R7Tga ネットワークやファイルから読んだバイナリの塊を構造体に当て嵌めて解析を楽にするなんてことは、よくやる。
まあ、本当だったらバイナリから読んで構造体側にコピーするような関数を作った方が良いんだろうけどね。(またはPerlのunpackみたいなやつ)。
まあ、本当だったらバイナリから読んで構造体側にコピーするような関数を作った方が良いんだろうけどね。(またはPerlのunpackみたいなやつ)。
320デフォルトの名無しさん (アウアウウー Sa21-lBRq)
2020/02/04(火) 16:00:02.30ID:MHG3R7Tga そういえばsscanf()と似たような感じでバイナリとフォーマットと可変引数で代入先ポインタ並べて渡すとバイナリ側から読んで値入れてくれるようなPerlのunpack風な関数も作ろうと思えば作れるね。
321デフォルトの名無しさん (ワッチョイ b67c-unxX)
2020/02/04(火) 19:11:16.20ID:b7qwiVAD0322デフォルトの名無しさん (スッップ Sd0a-x67y)
2020/02/04(火) 19:18:36.03ID:rvpdgwbCd コンパイラ依存や環境依存はビックフィールドだけじゃない
323デフォルトの名無しさん (スッップ Sd0a-x67y)
2020/02/04(火) 19:18:58.04ID:rvpdgwbCd ビットフィールド
324デフォルトの名無しさん (ワッチョイ 6aa5-OeZ9)
2020/02/04(火) 20:24:28.00ID:TWTPcweW0 あの大事件の裏にはこういうミスが隠されているのか……
325デフォルトの名無しさん (ワッチョイ 89b3-x67y)
2020/02/04(火) 20:31:06.36ID:CGekWIL20 コロン抜け?
326デフォルトの名無しさん (ワッチョイ 2a63-unxX)
2020/02/04(火) 21:26:03.56ID:lLuVC2X20 あれはFortranだろ
327デフォルトの名無しさん (アークセー Sxbd-nHCh)
2020/02/04(火) 22:02:12.09ID:xaJSTMSvx 僕のはリトルエンディアン
328デフォルトの名無しさん (ワッチョイ ea2c-KoMo)
2020/02/04(火) 23:14:03.74ID:6/2RTZHA0 漏れが、新幹線のチケット開発してた時には、ビットフィールドなどは使わなかった
全てのバイト内で、データの位置を決めて、ビット演算でやっていた
全てのバイト内で、データの位置を決めて、ビット演算でやっていた
329デフォルトの名無しさん (ササクッテロラ Sp0b-R1hy)
2020/02/05(水) 01:10:02.17ID:N1gPUNHxp 309のb_testの数値ってなぜ0x3344じゃないの?
それすらわからん
ここのスレレベル高いな
それすらわからん
ここのスレレベル高いな
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 「日本はドイツと違い反省せず」…中国外相、独外相に対日批判 台湾問題で理解求める [少考さん★]
- 【おこめ券】鈴木農相 米価維持の意図「一切ない」 [ぐれ★]
- 【警視庁】走行中の電車で女性に露出した下半身押しつけたか 無職の男(46)逮捕「チャンスがあればいつでもやる」 [nita★]
- バリ島で男子生徒ら集団万引きか、防犯カメラ映像が拡散 京都の大谷中学・高校が「窃盗行為」謝罪★6 [七波羅探題★]
- 【苺ましまろ】立民衆院議員、人気漫画の水着少女画像を「醜悪」タイ人少女の性搾取事件と関連付け…党内で反発 [少考さん★]
- 「残業キャンセル界隈」若者が増加?「職務放棄」との批判も…“定時退社の権利”どこまで通用するか [七波羅探題★]
- 高市政権「かけてもつながらない。機能していない」防衛当局間のホットライン機能せず [834922174]
- あたしゃやだよ
- 【高市悲報】中国軍「公海で空母の発着訓練するって事前通告したのになんで自衛隊機は急接近してきたんだ…?」中国軍困惑 [931948549]
- 【高市悲報】中国軍「公海で空母の発着訓練するって事前通告したのになんで自衛隊機は急接近してきたんだ…?」中国軍困惑★2 [931948549]
- 30過ぎた大人おじさんが大学生(昔)のままのファッションをする「おじさんキッズコーデ」、炎上して問題視される。 [153490809]
- 【朗報】ケンモジサンが買うふりかけ、二択に絞られる [394133584]
