C言語なら俺に聞け 154

■ このスレッドは過去ログ倉庫に格納されています
2020/01/14(火) 19:32:30.16ID:SgRnb4BR0
!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
2020/01/31(金) 21:29:06.27ID:aVH6lH010
4GLとか使って「COBOLの範疇」で書いたつもりになってるやつらが
縁の下の力持ちを知らないのか無視しているのかどっちでもいいが
悪いが鼻で笑わせてもらってたね

俺が見てた事例ではCじゃなくアセンブラだったが
2020/01/31(金) 21:30:33.47ID:aVH6lH010
元来、俺はそんなに皮肉屋じゃないはずなんだが
連中の上から目線がそうさせていた
195デフォルトの名無しさん (ワッチョイ eaad-Yjow)
垢版 |
2020/02/01(土) 06:47:44.88ID:PlRScEsI0
いや、まあ、CでCOBOLコンパイラ作る事は可能だろうけどね。
2020/02/01(土) 11:17:42.72ID:yTeildyw0
何十年か前、GCCをベースにシステムを作った金融サイトがあることはある
GPLに触れないようライブラリは全部自前で用意してた
端末、サバクラのやり取り、サーバー間のデータ交換、全部Cで作ってた
2020/02/01(土) 11:18:36.53ID:tav2AwxI0
GCC
2020/02/01(土) 12:36:41.04ID:50MDw/OE0
視力検査?
2020/02/01(土) 21:42:14.19ID:BhmlSyWc0
IOCCC
200>>187 (ワッチョイ 1163-+5rw)
垢版 |
2020/02/02(日) 01:07:46.29ID:8cBiUpXt0
みなさんありがとうございます
(googleもみると)あるにはありそうな気もするけど
やっぱあまりよくないのかな。強烈に速度がほしい。
201デフォルトの名無しさん (ワッチョイ 1163-+5rw)
垢版 |
2020/02/02(日) 01:09:27.11ID:8cBiUpXt0
一方でIoTや組込的な決済プログラムは結構あるそうな。
C言語は安心して使えるから好きなんだよね。
2020/02/02(日) 01:19:26.11ID:lNG3EL+m0
業務アプリケーションまで持って行くのが割と大変だと思う
例えばお金の計算させるにしても、概算で良いなんてことは普通無いし
そのライブラリ作っても、信頼性の検証もしないと行けなくなる
預金システムなら、安全堅牢なファイルシステムも工夫しないといけない
趣味や学習として作る分にはとても興味深いものがあるけれど
実用するには、それを得意とするミドルを利用する方が無難だと思う
203デフォルトの名無しさん (ワッチョイ 1163-+5rw)
垢版 |
2020/02/02(日) 02:59:35.06ID:8cBiUpXt0
むむぅ
2020/02/02(日) 07:10:56.28ID:9jRHEnns0
>>202
>お金の計算させるにしても、概算で良いなんてことは普通無いし
今は uint64_t があって、ほとんどカバーできますよ
2020/02/02(日) 07:40:39.94ID:D8WvcGqJ0
なにそのトンチンカンな発言
足し算引き算しかしないと思ってるの?
2020/02/02(日) 07:50:53.39ID:SWo7Ruqh0
1844京6744兆0737億0955万1615円まで扱えるなら
全人類の富を表現できるけど
10銭が循環小数になっちゃ困るね
2020/02/02(日) 09:10:15.49ID:Wawdq7250
10銭を1単位にすりゃいいんじゃね?
表現できる最高金額が1桁減っちゃうけど
2020/02/02(日) 09:12:29.11ID:SWo7Ruqh0
じゃあ1銭は循環小数でいいのかって話
きりねえだろ
2020/02/02(日) 09:18:53.11ID:Wawdq7250
>>208
じゃぁ今現在のシステムではどうなってんの?
2020/02/02(日) 09:20:01.71ID:VB3p6sP1M
>>208
韓国の方ですか?
2020/02/02(日) 09:31:06.07ID:SWo7Ruqh0
>>209
10進数で計算するんだよ、2進数じゃなく
2020/02/02(日) 09:35:04.50ID:Wawdq7250
>>211
そうじゃない
例えば円を単位としたとき小数点以下何桁まで保証してるのかって話
2020/02/02(日) 09:42:25.20ID:SWo7Ruqh0
>>212
それは場面場面で色々だ
任意精度演算ってやつ
2020/02/02(日) 09:47:08.09ID:Wawdq7250
>>213
はぁ?
きりがないんじゃなかったのか?
2020/02/02(日) 09:51:31.13ID:Rn0kkYyt0
一銭二銭、あるいはそれ未満を扱うのなら、uint64_t を固定小数点で使えばいいだけでしょうね

>>205
>足し算引き算しかしないと思ってるの?
お金の計算なんて 9 割が加減乗除で済むのでは?
お金の計算で特に必要で特別な計算ってなにかありますか?
2020/02/02(日) 09:52:20.20ID:Rn0kkYyt0
>>211
10進で計算しなければならない、その必要性はなんですか?
2020/02/02(日) 09:58:14.19ID:PeaPXPNSM
>お金の計算で特に必要で特別な計算ってなにかありますか?

複利計算で累乗
2020/02/02(日) 10:02:09.62ID:0Gqmr5420
>>215
例えば複利計算とかなら小数の計算の精度を厳密に規定しないと問題になるはず。専門外だから詳しくは知らないが、法律か金融機関ごとにでも決められているんだろう。
お前みたいにお金の計算はお小遣い帳をつけるくらいにしか使わないなら整数だけで問題ないだろうけど。
2020/02/02(日) 10:28:42.42ID:8cBiUpXt0
古い言語なのに意外と10進演算ライブラリとかもないですよね
個別に作ってるだけかもしれませんが
2020/02/02(日) 10:37:05.52ID:Rn0kkYyt0
>>218
小数点以下の丸めでは、例えば「五捨五入」のもあるみたいですし
でも「厳密に規定」とかいうほどの難しい方法はないとおもいますよ、普通に固定小数点の整数で問題ないのでは?

>>219
10進演算、って普通の整数の加減乗除とどう違うのですか?
2020/02/02(日) 10:45:51.01ID:j5gc2NvRd
本当に何も知らないんだねQZ
2020/02/02(日) 10:56:35.17ID:/IWX5gyF0
計算機ができる前は人が筆算してたんだよ、勿論10進で
それと合わなきゃならないの
だからBCDとかやるの

精度が確保されてればより正確なんだけど、「本当はこっちの方がより正確です」はダメなんだわ
それまでと変わっちゃダメなの
2020/02/02(日) 10:57:27.98ID:8cBiUpXt0
>>220
色々種類はあると思うけど10進数で小数点を扱えるんですよ
また丸め処理も10進数で出来るのですよ
2020/02/02(日) 11:00:28.10ID:Rn0kkYyt0
>>221
はい、8086 AAA, AAD, AAM, AAS 等の10進補正命令は知っていますが、今から考えても何故にアンパック形式10進なる形式を作ったのか、普通に2進整数+固定小数点では何故だめだったのか、納得できる理由をずっと探しているのです
2020/02/02(日) 11:04:52.03ID:Rn0kkYyt0
>>222
つまり「人の作業との突合せ・検算のために10進演算や BCD があった」ということですか?
でも、そうであっても普通に 2 進整数+固定小数点の演算で問題ないと思うのですが

>>223
BCD で出来る、ということを知りたいのではなく(なぜならばそれはすでに知っているから)、なぜ BCD が必要だったのか、という理由が知りたいのです
2020/02/02(日) 11:23:45.02ID:85W5AYJA0
金融業界の習わしの発端について知りたいなら、それ関係のスレで聞けばいいんじゃね?
金融関係システムが10進で計算してるのは常識なんだし要求要件なんだから
それに疑問挟んでごねるプログラマーにはシステム開発発注したくねぇなぁ
2020/02/02(日) 11:32:34.14ID:nz0OxFB30
単純に考えて、「(10進)小数点以下N桁目で四捨五入する」なんて規定があるときに
2進固定小数でやるのは面倒くさいじゃん。
2020/02/02(日) 11:36:06.33ID:SWo7Ruqh0
>>214
どこで四捨五入するかなんて
プログラムじゃなく経理さんのルールだかんね
プログラマはそれに合わせるってだけのこと
2020/02/02(日) 12:32:50.80ID:VB3p6sP1M
>>228
だったら固定小数点で良くね?
きりが無いなんてことはない
230デフォルトの名無しさん (ワッチョイ 39d2-fhCF)
垢版 |
2020/02/02(日) 12:37:44.03ID:w7N5c9rM0
そもそもお金に0.1円とかないから四捨五入は必要ない
2020/02/02(日) 12:43:11.07ID:SWo7Ruqh0
固定か浮動かって問題じゃない
10進の0.1が2進では0.00011001100110011001100110011...という循環小数になり
金の話では出てこないはずの誤差が出るって話だ

最小単位が1円のときは10銭、10銭のときは1銭が2進演算では正しく扱えない
最小単位をいくらにしても同じことというのをキリがないと言ったんだ
2020/02/02(日) 12:46:55.96ID:VB3p6sP1M
>>231
最小単位以下の誤差なんて累乗計算でも出るじゃん
2020/02/02(日) 12:48:44.37ID:SWo7Ruqh0
>>230
\1,000,500_に源泉税率10.21%を掛けたらいくらになる?
2020/02/02(日) 12:49:20.92ID:SWo7Ruqh0
>>232
誤差の出方が10進と2進では違うって話
235デフォルトの名無しさん (ワッチョイ 39d2-fhCF)
垢版 |
2020/02/02(日) 12:51:06.34ID:w7N5c9rM0
誤差がでてもそれよりすごく大きい数で四捨五入するんだから同じだろ
2020/02/02(日) 12:51:15.29ID:VB3p6sP1M
>>234
性質が違っても誤差は誤差
あんた金の話では誤差は出ないって言ったばかりだぞ
鳥頭か?
2020/02/02(日) 12:56:31.50ID:ceem9FS20
10進数では、1/3 が循環小数で、

2進数では、1/10 が循環小数って、言うだけ!
2020/02/02(日) 12:59:27.07ID:SWo7Ruqh0
>>236
それは間違ってるぞ
同じ計算を他のところ、たとえば税務署でやったら結果が違うなんてことになるとまずいだろうが
239デフォルトの名無しさん (ワッチョイ 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まで全部表示できるけど
2020/02/02(日) 13:28:12.47ID:OL0mFBDc0
計算機イプシロンでいいだろもう
今回の低レベルの諍いについてvoid君はどう思う?
2020/02/02(日) 13:32:17.04ID:D8WvcGqJ0
結果の型とか四則演算方法とか単純な話じゃなくて
金融系の計算て数学やコンピュータの世界の常識とは違う計算をするんだよ
式自体からしておかしくて詐欺っぽいのもある

>>226の言うとおり
2020/02/02(日) 13:34:11.48ID:D8WvcGqJ0
100万円を利息年3%で借りた時
1年で利息はいくら?
2020/02/02(日) 13:39:19.37ID:Wawdq7250
そんなもんどんな返し方をするかがわからんと解析解さえ出ない
2020/02/02(日) 13:39:53.93ID:Rn0kkYyt0
>>226
>金融関係システムが10進で計算してるのは常識なんだし要求要件なんだから
金融関係の業務でシステム内部表現まで10進表現(BCD等)にせよ、とする理由は、あなたはどのように推測しているのですか?
私は、金融関係であっても多桁長演算+固定小数点で顧客の要望は十分に満たされると考えますが。
金融系発注側も単に「double は使わないで」くらいの意味でしかないのでは?そして現実の実装も多桁長演算+固定小数点だったりするのでは?

あなたの >>226 の記述には合理性を感じることができません
2020/02/02(日) 13:43:24.73ID:Rn0kkYyt0
>>227
その場合、小数点以下N桁目、あるいは余裕をみて N+4桁目くらいを考えて
10^(N+4) 倍して整数1 と内部表現 10^(N+4) を一対一対応とすれば整合性はとれるのでは?(これを固定小数点といいます)
2020/02/02(日) 13:45:56.70ID:Rn0kkYyt0
>>231
10進の1 の内部表現を 10, 10進の2 の内部表現を 20, 10進の3 の内部表現を 30 …、10進の0.1 の内部表現を 1
という固定小数点にすれば、 お金の計算のような演算では十分なのでは?
2020/02/02(日) 13:46:58.67ID:Rn0kkYyt0
>>242
まあ五捨五入というのは、よそではあまり聞かないですね
2020/02/02(日) 13:56:18.00ID:gkoi3ncld
値を保持するだけなら何でも良いよ
保持出来るだけの精度が有れば
固定小数点だろうが整数部と小数部だろうが
10進浮動小数点だろうが
BCD整数だろうが

計算の方法、式、丸め方が特殊で
途中の型も特殊だったりする
これに多くの評価が必要

だから
結果の型だけを語るのはトンチンカン
2020/02/02(日) 14:01:47.01ID:nz0OxFB30
>>246
一回計算する毎にいちいち2進に戻すのにそんな手間かけるより10進演算器用意する方が効率的ということ
2020/02/02(日) 14:06:26.86ID:gkoi3ncld
手間とか効率とかの問題じゃなくて
値の一貫性の問題

最終的に得る値が整数だとしても
途中の計算精度や丸め方によって誤差が微妙に異なり
結果1円の誤差になりました
じゃダメなの
2020/02/02(日) 14:11:34.03ID:VB3p6sP1M
>>238
あんたの言う誤差とは何かね?
2020/02/02(日) 14:12:15.30ID:gkoi3ncld
途中の計算精度があれば良いってわけじゃない
100桁精度でも無限精度でもダメ

決まってるロジック通りの結果を返さなきゃダメ
数値計算と思わない方が良いかも
2020/02/02(日) 14:14:53.67ID:gkoi3ncld
決められてる通りのロジックで返した時の値との差が誤差

誤差は一切許されない

これがお金の計算
2020/02/02(日) 14:17:09.96ID:gkoi3ncld
オンラインゲームも一貫性が必要だったりする
対戦相手と結果が異なってはまずいので

そういう部分では
厳密にCPUでもGPUでも同じ値である必要かある
256デフォルトの名無しさん (ワッチョイ 39d2-fhCF)
垢版 |
2020/02/02(日) 14:17:57.04ID:w7N5c9rM0
わかったぞ
十進数だと0.5円になるときには四捨五入すると1円になるけど
2進数の時0.4999999999円みたいになった時0円になっちゃうってこと?
257デフォルトの名無しさん (ワッチョイ 39d2-fhCF)
垢版 |
2020/02/02(日) 14:20:40.80ID:w7N5c9rM0
0.1円の誤差をなくすために0.1円以上掛けたら意味なくない?
2020/02/02(日) 14:23:22.92ID:gkoi3ncld
1円でも誤差があると帰れない銀行員の話とか知らない?
2020/02/02(日) 14:24:38.04ID:w7N5c9rM0
日本が異常なだけでしょ?
アメリカとかだと1円払って終わりじゃね?
2020/02/02(日) 14:30:28.56ID:gkoi3ncld
私が直接話を聞いたのは外資系の銀行員から
2020/02/02(日) 14:32:20.39ID:Wawdq7250
つまり
10進で計算するのは,10進で計算せよというロジックがあるからであって,循環小数を避けるためではない
ということか
そういうことなら誰も文句ないんじゃね?
262デフォルトの名無しさん (ワッチョイ b501-0Ybi)
垢版 |
2020/02/02(日) 14:37:37.76ID:mzCY/+E00
https://ideone.com/HdUvEa
こういうことでは。
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 を使う
264デフォルトの名無しさん (ワッチョイ b501-0Ybi)
垢版 |
2020/02/02(日) 14:48:07.68ID:mzCY/+E00
もういいわ。
おまえ等のプログラムじゃ金の計算できないわ。
エクセル使う。
2020/02/02(日) 14:48:39.82ID:lNG3EL+m0
三人で三等分して、構成比を%で表示しろと言われ、
何も考えずに計算結果出して見せたら、
合計が100%になってないと文句を言われたw
266デフォルトの名無しさん (ワッチョイ b501-0Ybi)
垢版 |
2020/02/02(日) 15:07:37.05ID:mzCY/+E00
一番上のお姉ちゃんがプリン食べれないやつか。
2020/02/02(日) 15:08:31.39ID:Rn0kkYyt0
>>250
>一回計算する毎にいちいち2進に戻すのにそんな手間かけるより10進演算器用意する方が効率的ということ

いいえ、値の保持と計算はずっと 2 進+固定小数点のままで行い、人間に値を見せるときにはじめて 2 進→ 10 進変換を実施します

>途中の計算精度や丸め方によって誤差が微妙に異なり

お金の計算における丸め方法の規則は、四捨五入にしても五捨五入にしても 10 進法整数に親和的なのだから、多桁長表現+固定小数点で表現すればかなり厳密に扱えるとおもいますよ
2020/02/02(日) 15:11:06.99ID:Rn0kkYyt0
>>263
>Decimal を使う
Decimal の内部表現方法に興味がありますね、まさか、今でも BCD だとは思えませんが(x86_AMD64 でも関連ニーモニックは消えました)、もしかして?!
2020/02/02(日) 15:19:29.78ID:w7N5c9rM0
小数点の位置と整数の2つの情報で10進数の少数は誤差なくあらわせるよ
270デフォルトの名無しさん (ワッチョイ b501-0Ybi)
垢版 |
2020/02/02(日) 15:22:25.38ID:mzCY/+E00
>>269
どうやるんだよ。
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で表せる
273デフォルトの名無しさん (ワッチョイ 39d2-fhCF)
垢版 |
2020/02/02(日) 15:36:23.54ID:w7N5c9rM0
少数点以下の整数と小数点以上の整数でも表せる
2020/02/02(日) 15:38:49.63ID:anvSpfnfM
機械語なら商と剰余はたいていいっぺんに計算できるけど、Cからそれらの機械語が使われると期待していい書き方ってどうすればいい?
10年来の疑問
275デフォルトの名無しさん (ワッチョイ 39d2-fhCF)
垢版 |
2020/02/02(日) 15:40:29.20ID:w7N5c9rM0
Cのライブラリーにいっぺんに計算されるやつがある
2020/02/02(日) 15:42:13.13ID:lNG3EL+m0
小数と少数を間違えないで
2020/02/02(日) 15:45:20.77ID:Rn0kkYyt0
>>267
>>いいえ、値の保持と計算はずっと 2 進+固定小数点のままで行い、人間に値を見せるときにはじめて 2 進→ 10 進変換を実施します

>>271
>丸めは計算ごとに適用されるんだよ、馬鹿。

そうか、確かに私にも落ち度がありました、2進整数+固定小数点ならば、丸める桁まで 10 で割り続けて余りを求める必要がありますね、これはほとんど2進→10進変換といっていいですね
しかし、全桁を 2進→10進する必要はなく、丸める桁までで 2 進→ 10 進するだけでいい

x86-AMD64 では 8086 時代の BCD 補正命令は全部なくなってしまったことから考えても、「Decimal」型は整数+小数点位置なんじゃないかな…
2020/02/02(日) 16:00:27.23ID:SWo7Ruqh0
>>252
鳥頭をそのまま返す

すまんが俺は介護人でも保育士でもない
おまえの相手は疲れすぎる
2020/02/02(日) 16:24:08.92ID:VqF3mFhWM
>>275
ポータブルなやつを頼む
280デフォルトの名無しさん (ワッチョイ 39d2-fhCF)
垢版 |
2020/02/02(日) 16:27:09.95ID:w7N5c9rM0
>>279
標準ライブラリーだからポータブル
2020/02/02(日) 16:40:10.12ID:gkoi3ncld
>>277
IEEE754にも10進数があるから見てみれば
2020/02/02(日) 16:50:09.63ID:VB3p6sP1M
>>278
で、あんたの言ってる誤差ってなんなのさ
説明できないの?
2020/02/02(日) 17:00:29.36ID:SWo7Ruqh0
>>282
説明はもうしたんだよ鳥頭野郎
てめーで過去レス探せ

他のやつにじゃなく
おまえさんにレスアンカーつけて書いたぞ
2020/02/02(日) 17:03:20.75ID:lNG3EL+m0
円周率は概ね3です
2020/02/02(日) 17:20:36.09ID:VB3p6sP1M
>>283
あんたの言ってる誤差は循環小数云々の誤差ということでいいのか?
2020/02/02(日) 17:52:51.69ID:8cBiUpXt0
盛り上がってるなー。
が、なんか思ったのと違う進行。。
2020/02/02(日) 18:01:39.53ID:lNG3EL+m0
>>286
軌道修正してくれたまえ
このままでは銀河系脱出してしまう
2020/02/02(日) 19:18:27.60ID:825maVGz0
>>219
そりゃーC言語よりも古いCOBOLがあるもん
銀行案件は全部そっち任せだろ

だからそういうライブラリを発達させる必要が無かった

COBOL最盛期がいつかは知らんがきっとIBM最高益の時代あたりだろ
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;}
2020/02/02(日) 20:51:51.61ID:gkoi3ncld
割り算は遅い
スーパーコンピュータでも遅い

定数の割り算で済む所は定数に
並列化可能ならSIMD命令で複数一気に
2020/02/02(日) 20:55:57.98ID:SWo7Ruqh0
>>285
まあそういうことだ
おまえさんにとっての関心事に関係するかどうかは知らん

さっき言ったとおり、俺は保育士じゃないんで他人ん家の坊ちゃん嬢ちゃんは扱えない
プラレールだかリカちゃんだかの相手はしてられない
2020/02/02(日) 20:57:05.76ID:SWo7Ruqh0
>>290
タンジェントは遅いか?
べき乗は遅いか?
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況