C++相談室 part139

レス数が950を超えています。1000を超えると書き込みができなくなります。
2018/10/06(土) 00:59:48.54ID:CdYUXXMG0
次スレを立てる時は本文の1行目に以下を追加して下さい。
!extend:on:vvvvv:1000:512

C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。

前スレ
C++相談室 part137 (正しくはpart138)
http://mevius.5ch.net/test/read.cgi/tech/1535353320/

このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.103【環境依存OK】
https://mevius.5ch.net/test/read.cgi/tech/1530384293/

■長いソースを貼るときはここへ。■
 http://codepad.org/
 https://ideone.com/

[C++ FAQ]
https://isocpp.org/wiki/faq/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)

----- テンプレ ここまで -----
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
896デフォルトの名無しさん (ワッチョイ 917c-aDDJ)
垢版 |
2019/01/06(日) 14:27:57.77ID:UQlfmMBy0
中学生か
2019/01/06(日) 16:25:01.53ID:gVP3A6Xh0
>>895
数学的にはそれで完全に正しい。
しかしコンピュータには誤差があるので、
itoa() や printf() などを自分で実装するような場合、
よく考えないといけないかも知れない。

log_10(x) で計算すると N 桁だということになったとしても、
itoa() などを実装するアルゴリズムによっては、ある条件の時に
誤差によって、1ケタだけずれるかもしれない。

めったに無いことだが、これで銀行システムや戦闘機のシステムが
ダウンしたりするかも知れないので、数学は重要。
2019/01/06(日) 16:27:31.80ID:gVP3A6Xh0
ちなみにオイラは数学は首席だったが、どういう場合にそれが生じるかは
即答することは出来ない。アルゴリズムを慎重に選ばないと、その誤差によって
システム・ダウンやアプリのハングアップ、保護例外などを引き起こす可能性が
わずかだが存在するかもしれない。
2019/01/06(日) 16:32:25.57ID:BCtLt9aar
へぇ〜科目毎に首席決まるんだ笑
2019/01/06(日) 16:48:35.20ID:5fyS0TRC0
n>=0かつ10^n <= m < 10^(n+1)
のときに整数mは十進n桁の数と言える。
不等式に常用対数を適用し、
n <= log_10 (m) < n+1
が得られる。つまり、1以上の整数mに常用対数を適用し、さらにガウス記号を適用したものがmの桁数だ。
m=0のときは一桁になることに注意する。
2019/01/06(日) 16:50:11.91ID:5fyS0TRC0
計算結果の桁数が違うときは、常用対数の誤差とガウス記号の誤差の問題になる。
2019/01/06(日) 16:57:04.99ID:5fyS0TRC0
常用対数の誤差については、有効桁数を使うか、区間演算により、誤差の範囲を見積もることが可能。そこで、誤差の範囲が整数をまたぐかどうかを判定すれば、問題は解決する。
2019/01/06(日) 16:59:59.29ID:5fyS0TRC0
整数をまたぐ可能性があるときは実際に整数を文字列化すれば正確な桁数が算出可能。もしくは任意精度の多倍数演算により自由に精度を高めて再計算すればいい。
2019/01/06(日) 17:00:41.37ID:5fyS0TRC0
*多倍長演算*
2019/01/06(日) 17:07:05.46ID:5LUvK3vXd
オイラーは首席だったのか?
2019/01/06(日) 17:11:34.26ID:5LUvK3vXd
NO DATA.
2019/01/06(日) 17:23:51.30ID:5fyS0TRC0
ほら、反論しろよ?
2019/01/06(日) 17:41:26.55ID:kxJaA4Vn0
ふつー数値から文字列に変換する変換関数そのものに長さを報告させるだろ
文字列の格納先のメモリを確保するときのサイズ見積もりに対数を使う場合は
ワーストケースで誤差が出た場合に備えればいい
2019/01/06(日) 17:44:32.37ID:5fyS0TRC0
具体的なほとんどのプログラムでは常用対数の誤差を一桁以内にすることは可能だろう。
2019/01/06(日) 18:06:44.32ID:z+pllqoQ0
ゲームエンジンでおすすめありませんか?
911デフォルトの名無しさん (ワッチョイ 8901-ikDe)
垢版 |
2019/01/06(日) 18:12:46.00ID:q7b7d/XL0
本屋さんにはUnityコーナーがあるよ。
2019/01/06(日) 18:19:00.70ID:z+pllqoQ0
>>911
siv3dみたいなのを探してます
オープンソースで参考になるやつ
2019/01/06(日) 18:21:40.42ID:mghQxkOO0
>>912
glfw
2019/01/06(日) 18:22:16.06ID:5fyS0TRC0
スマホゲームならWebGL一択、ハイエンドならUnity、Unreal Engine、CoCo3D、ローエンドならOpenGL, DirectDraw, Haxeといったところか。
2019/01/06(日) 18:34:54.20ID:z+pllqoQ0
>>913
>>914
うーん
一応webgl考えてみます
2019/01/06(日) 19:53:45.75ID:viPzIL890
>>908
変換関数そのものをプログラムしたい場合に、あらかじめ桁数が分かって
いる方が便利 or 効率が良い、場合があり、log_10(x)を使用したくなってしまう。
ところがが、log 計算には誤差が有る可能性があるので、その値を過信するのは
問題だと言うことが言いたかった。

例えば、文字列化する際には、多くのアルゴリズムでは、下の方の桁から
決まっていく。しかし、文字列バッファには、上のケタから左詰で入れて
行く必要がある。となると、最初から桁数が分かっていれば、簡単に
プログラムできるのではないかと言う誘惑に駆られてしまう。

後、10で割っていって余りを使う方法は簡単ではあるが、そのアルゴリズム
そのものにも誤差が有る可能性が指摘されている。
2019/01/06(日) 20:10:05.15ID:COVE8lO90
>>916
>10で割っていって余りを使う方法は簡単ではあるが、そのアルゴリズムそのものにも誤差が有る可能性が指摘されている。
え?10で割っていくのにどうして誤差が出るの?
2019/01/06(日) 20:16:22.17ID:kxJaA4Vn0
>>916
変換関数の中でメモリ割り付けを行うのが好みなのか?
2019/01/06(日) 20:27:50.31ID:Tw0qXLcy0
んま実際にわ数値の桁数とか型を見たら一発でわかるんですけどねwwwwww
logは人間の感覚特性にマッチした量的尺度を表したり(例:dB)、
情報量の表現に使う(同じものがいっぱいあるという状況は情報量を上げない)という目的が大きい
920デフォルトの名無しさん (ワッチョイ 8901-ikDe)
垢版 |
2019/01/06(日) 21:04:54.26ID:q7b7d/XL0
HTMLパーサーありますか?
2019/01/06(日) 21:27:13.56ID:kxJaA4Vn0
>>919
intは何桁だ?
2019/01/06(日) 22:23:30.07ID:IpTON8AO0
>>910
coronaがオープンソース化されたらしい
2dだが
2019/01/06(日) 22:46:51.25ID:viPzIL890
>>917
前提として浮動小数点数(float/double など) の話だけど、誤差が無いとは言い切れない
事は分かると思う。

誤差を少なくする方法として、10で割ったりせずに、最初から、
10000.0, 1000.0, 100.0, 10.0, 1.0, 0.1, 0.01, 0.001
20000.0, 2000.0, ・・・
30000.0, 3000.0, ・・・
40000.0, 4000,0, ・・・
のようなものを計算しておいて、比較したり引き算したりする方法が
あるそうな。

浮動小数点値の場合、当然かもしれないが log を使わずに、IEEE の仕様を元に
指数部のBIT部分を読んで利用する方がいいらしい。
2019/01/07(月) 08:39:12.81ID:4xwPMGVF0
桁数が重要になるような銀行や事務系の話?
それなら10進演算だろ
IEEEでも定義されてる
科学計算だと対数で問題ない
2019/01/07(月) 13:35:29.03ID:QyN6UiiI0
>>924
自分で printf() を実装する場合の、浮動小数点数を文字列に直す時の話。
2019/01/07(月) 13:47:41.82ID:hsoUdh4l0
自分でprintfを実装するとか銀行のシステムを作るよりレアケースだな
2019/01/07(月) 17:09:10.70ID:Cio2TleD0
ここがC++スレということを忘れて内科医?
printfはオーバーロードできるしグローバル以外の空間にも導入できる
2019/01/07(月) 20:19:39.05ID:hm6qCAOJ0
そんなことするんじゃねーよカスが。
2019/01/07(月) 23:14:26.87ID:lPhgCzer0
Pythonには素の遅いPythonとJITを使った素のPythonよりとてつもなく速いPythonがあるようですが
Boost.PythonでPythonスクリプトを読み込んで実行した場合は素の遅いPythonの速度になる認識であっているでしょうか?
また、Boost.PythonでJIT版Pythonを実行することは可能でしょうか?
2019/01/09(水) 00:35:27.60ID:I3YK3qiz0
>>929
全然その辺知らないけど、
そもそも、python の言語仕様自体がJITを使ったとしてもC/C++ほどの速度には
ならないはずだし、そもそも NumPy 使わないと遅いということは聞いてる。
大体のスクリプト言語は、言語仕様の段階で例えコンパイル言語化しても
どうすることも出来ない遅さが含まれてしまってる。
931デフォルトの名無しさん (ワッチョイ 917c-aDDJ)
垢版 |
2019/01/09(水) 11:18:19.67ID:+j6Vua/i0
numpy使えばC並みの速度が出るようにも書けるが
numpy使ったからと言って馬鹿が描くと素のpython以上に遅くなる
2019/01/09(水) 13:18:31.63ID:ePvWX0K6M
速度なんて誰でも気にしない優しい世界
2019/01/09(水) 19:27:53.32ID:LMntakFz0
用意されてるライブラリ使えと。
バカがイキって作ったライブラリより普通に速いから。
2019/01/09(水) 19:38:55.54ID:P7Qg82S60
numpyの使い方の話ではなく?
2019/01/09(水) 20:20:55.44ID:1OkzU/m20
というかスレチでは?
2019/01/09(水) 21:54:22.59ID:eG2hyzXv0
・動的型言語
・自動メモリ管理
・リンクリストと配列を余り区別しない書き方をする人が多い傾向。

これらがあるので、pythonをコンパイル型にしてもある程度以上の高速化は
難しいと思われる。
2019/01/09(水) 22:15:33.61ID:oaJURpH60
Cythonの話?
2019/01/09(水) 22:24:15.05ID:eG2hyzXv0
pythonの速度測定は、やってみたことないけどね。(^_^;)
2019/01/10(木) 08:22:27.02ID:jdFEneY4a
Pythonにリンクリストなんか無いだろ
Pythonの配列(list)はvector相当の動的配列
実はリンクリストが動的配列より速いケースってC++でも現実にはほとんど無くて、あまり価値のないデータ構造だよ
拡張・縮小にメモリの再確保が不要で抽象化を必要としないから、Cのような生ポインタを好んで使いまくる言語と相性がいいだけ
2019/01/10(木) 13:04:00.84ID:EKtor9ZH0
ttps://github.com/python/cpython/blob/master/Modules/arraymodule.c

3000行のありがたいソースコードを読み解けば何かが分る
2019/01/10(木) 13:06:20.15ID:RGz7BwRGM
>>940
普通に動的配列だな
2019/01/10(木) 15:05:21.30ID:681jFEkb0
ハード屋さんが頑張りすぎて必要なくなっちゃったな
でも便利だからforward_listを使うことはある
943デフォルトの名無しさん (ワッチョイ 4ea0-N8Dk)
垢版 |
2019/01/10(木) 20:06:55.51ID:Dp9bpyFY0
tupleってメンバ関数で値取り出せないのね。
std::get<N>( t ) ってファンキー過ぎやしませんか。
下手に使うとコンパイルに時間食われそう。
2019/01/10(木) 21:56:09.15ID:cH4uyoE20
関数やテンプレートで、できることとできないことを
冷静に考えてみな
2019/01/10(木) 22:54:40.61ID:pr4jZotH0
>>944
テンプレート化すればメンバ関数にすることはできるのでは?
2019/01/10(木) 23:01:28.43ID:681jFEkb0
コードを生成するのはプリプロセッサの役割
2019/01/10(木) 23:13:51.80ID:cH4uyoE20
>>945
すまん、いま泥酔状態だ
あとでな
2019/01/10(木) 23:31:47.36ID:lkkMD/RY0
メンバテンプレートにするとtupleをテンプレートに放り込んだときに
t.template get<0>()
と書かなきゃならなくなってこりゃないわーで皆が合意したからじゃ
949デフォルトの名無しさん (ワッチョイ 4ea0-N8Dk)
垢版 |
2019/01/11(金) 13:20:57.05ID:QV4rGvMY0
せめてstd::tuple::get<N>( t ) にして欲しかった。
std名前空間汚れすぎ。
950デフォルトの名無しさん (ワッチョイ a57c-Iup+)
垢版 |
2019/01/11(金) 13:34:51.99ID:5RUmP2fm0
>>943
それは確かに糞仕様だと思うが
テンプレートの意味から言えば仕方ないのかも知れない
(どんな型でも入れられるならテンプレート以外でやるべき)
2019/01/11(金) 14:22:09.67ID:gs9IdzGQM
他のコンテナでも同じように使える様にしたかったんじゃないの
オーバロードで
2019/01/11(金) 14:50:24.94ID:e7J07k250
std::getは固定長コンテナなら何でも使えるぞ
std::pairでもstd::arrayでも生配列でも
2019/01/11(金) 15:52:17.33ID:uZGQy9uP0
>>949
std::getにすることによってテンプレート引数にtupleと見なせる型(pair,array)を使うことができるようにしたいからそうなっている
2019/01/11(金) 15:56:06.33ID:uZGQy9uP0
ちなみにstd::getのユーザーによる特殊化は次から禁止される予定です
2019/01/11(金) 17:29:27.31ID:qkp6ca1e0
ポリモーフィズムを使っていて、ダウンキャストを行うときって
dynamic_castをしてみてnullptrかどうかを判断するのがベストな手順なんですか?
RTTIから実際の型情報を引っ張ってくる手段はないものでしょうか
2019/01/11(金) 18:21:19.24ID:3LH9+DohM
>>955
もちできるけど、検査したい型を継承した型を渡されたら動かないよ?
2019/01/11(金) 19:17:46.71ID:KlFqADLA0
>>955
それこそポリモーフィズムで派生クラスのthisを直でもらえばいいんじゃないの
958デフォルトの名無しさん (ワッチョイ 4ea0-N8Dk)
垢版 |
2019/01/11(金) 19:25:12.52ID:QV4rGvMY0
>>955
typeid で type_info 取れるよ。
基底クラスにenum Type 等を持たせてswitchも手の一つ。
処理内容によってはvisitor パターンが使える。俺が知ってるのはこれくらい。
2019/01/11(金) 20:46:28.26ID:e7J07k250
まず、なるべくダウンキャストなんか必要ないようにするのが最初だけどな
2019/01/11(金) 20:50:53.28ID:uZGQy9uP0
ダウンキャスト使わないのがベスト
2019/01/11(金) 21:13:21.95ID:ymL5E9Q60
>>955
ダウンキャストが必要になるなら、選択はそれしかない
2019/01/11(金) 22:23:52.97ID:jxLB4o2EM
>>955
ダウンキャストしたいんだよね?
なんで実際の型情報なんかを欲しがる理由がわからん
963デフォルトの名無しさん (ワッチョイ dd01-RNo8)
垢版 |
2019/01/11(金) 23:12:06.09ID:TUR+WyZ10
カミカゼキャストについて教えてください。
不意にフレーズが浮かんだのです。
2019/01/12(土) 00:03:01.76ID:i0P8FrwoM
SOLID守ってんのかよちゃんと
965デフォルトの名無しさん (ワッチョイ 4ea0-N8Dk)
垢版 |
2019/01/12(土) 01:42:52.85ID:Cfay/yS40
dynamic_castでnullptrなりbad-cast拾うのはお勧めできない。
2019/01/12(土) 01:53:56.64ID:ygc4MJ1X0
>>965
nullptrでキャスト可否を確認するのは普通の使い方だろ…
2019/01/12(土) 01:57:02.82ID:WnhdkTsC0
cならともかくc++でキャストが必要になるのはどっかやばいことになってる可能性を考えた方がいい
2019/01/12(土) 03:58:57.87ID:xRzP6oFDa
ライブラリの関数の引数が非constのchar配列で渡したい文字列がstd::stringに入ってるとき
.c_str()をconst_castしてるけどあかんの
2019/01/12(土) 04:35:25.22ID:vq0ymgcL0
opencvを使用して画像処理を行ってるんですが画像データにAWGNを加える方法が分かりません
グレースケール化させて処理をしています
乱数生成などは理解しているんですがその乱数を使ってどのような値として輝度値に影響させるのかが分かってません
よろしくお願いします
visual c++を使用しています
2019/01/12(土) 04:53:59.45ID:vq0ymgcL0
>>969
Mat s;
src.convertTo(s, CV_16S);
Mat noise(s.size(), CV_16S);
randn(noise, 0, sigma);
Mat temp = s + noise;
temp.convertTo(dst, CV_8U);

今こう考えているんですがあっていますでしょうか
srcが原画像、dstがノイズ画像です
2019/01/12(土) 04:55:24.88ID:k4bgy+v70
画像処理のことなんか知らん
2019/01/12(土) 05:30:28.09ID:DxcCYmak0
>>955
RTTIから実際の型情報を引っ張ってくる手段というとtypeidだね
void func(ios_base* ptr)
{
if(typeid(*ptr) == typeid(istream) { /* ... */ }
if(typeid(*ptr) == typeid(ostream) { /* ... */ }
}
2019/01/12(土) 08:53:04.29ID:Ma3Bi+e40
>>968
非constのchar配列を要求するという事は書き換えられる可能性がある
逆にconst付でchar配列を返す方は書き換えないという前提で渡してる
面倒だけどコピーしてから渡すべき
2019/01/12(土) 09:04:15.07ID:VES9RvQbM
>>973
さすがに神経質すぎる
そのライブラリの関数が文字列を書き換えない仕様なんだったら信用すればよい
そんなこと言い出したら何一つ信用できなくなってプログラムなんか書けん
2019/01/12(土) 09:10:15.98ID:Ma3Bi+e40
>>974
書き換えない、という仕様なら最初からconstを要求すればいいだけのこと
constを要求していない以上書き換えられる可能性を考慮するのは当たり前の前提
976デフォルトの名無しさん (ワッチョイ a57d-VK1S)
垢版 |
2019/01/12(土) 09:12:16.23ID:iREAiCU50
constついてないってことは内部で書き換えるという明確な意思表示だろ
2019/01/12(土) 09:29:29.58ID:VES9RvQbM
Cのライブラリに依存してるとか普通にあるだろ
2019/01/12(土) 09:31:51.80ID:VES9RvQbM
あと、ライブラリを作った奴のスキルの問題でconstを付けるべきときに付いてないのも仕事でやってりゃ普通にあるぞ
2019/01/12(土) 09:34:33.47ID:Ma3Bi+e40
Cのライブラリに渡すのならなおらstd::stringの内部配列を渡すべきでないし
そのようなスキルの低い作者の作ったライブラリの何を信用しろと言われるのか
2019/01/12(土) 09:35:58.84ID:VES9RvQbM
Cに一切ポインタ渡すなって?
凄いこと言うなあ
2019/01/12(土) 10:17:58.63ID:D4HU0Own0
なにもそう煽らなくても
現場の人間か責任を負う立場の人間かで意見も異なるのがわかるだろうに
2019/01/12(土) 10:56:59.61ID:Fa1DhIVTa
責任を負う立場の人間がconstがどうのなんて気にするわけないでしょw
「契約相手がそう言ってるなら信用すればよい。違っていたら相手の責任だ。」で終わりだよ
2019/01/12(土) 11:23:34.77ID:WnhdkTsC0
まあ契約でそうなってても残業するのは作業者だからな。。
バカの言うことなんて信用しないで安全に倒した方が正解だわ。
984デフォルトの名無しさん (スップ Sd7a-9pEX)
垢版 |
2019/01/12(土) 11:34:06.80ID:JcHNo1aqd
constは付いてないですけど内部で書き換えはしません
なんて仕様書に書いてあるのか
2019/01/12(土) 12:01:03.58ID:VES9RvQbM
void displayText(char* text);
文字列を表示します
text : 表示する文字列

これが仮にtextを書き換えてしまうとして、それをコピーで回避できたとしても、
そんなレベルのゴミがまともに機能するとは到底思えん
そんなことを言い出したらキリがない
2019/01/12(土) 12:48:58.54ID:d9Np0YH50
>>942
1. 要素数を N としたとき、1つの要素の処理に要する時間が O(N) になるか、
  O(1) などの違いなので、本質的にハードがいくら良くなっても解決する
  問題ではない。O(N) のアルゴリズムは、N が大きくなった場合には、
  ハードの良さを台無しにしてしまう。なので、アルゴリズムの選定はとても
  重要。

2. 動的配列でも、配列の最後に追加する場合は、リンクリストと遜色ない速度は
  出る可能性は十分あるが、配列の途中に追加する場合は、宇宙人でも無理。

3. 逆に、リンクリストの場合は、先頭から数えて、「k 番目の要素」にランダム
  にアクセスすることを高速化することは、宇宙人でも無理。

4. 「宇宙人でも無理」の意味が理解できるためには、数学的感性が必要。
  理解できない人には理解できないかもしれない。
2019/01/12(土) 13:04:53.68ID:VES9RvQbM
>>986
問題は、リンクリストの途中に挿入したいとき、予め挿入位置の直前や直後のノードへのポインタを持っていなければならないことだ
そんなケースは現実の開発において殆ど無い
持っていなければ挿入位置に辿り着くまでにO(N)のシーケンシャルアクセスが発生する
そして、リンクリストはメモリアクセスの局所性が欠片もないデータ構造であり、
動的配列と比較してシーケンシャルアクセスのパフォーマンスは極めて劣悪である
2019/01/12(土) 13:27:37.63ID:xzy8SRaPM
テキストエディタのバッファ管理なんてのが
そのケースなんですけどね
2019/01/12(土) 13:33:01.95ID:VES9RvQbM
>>988
うん。レアケースだね。
2019/01/12(土) 13:34:27.13ID:xzy8SRaPM
我田引水の基地と判明
991デフォルトの名無しさん (ワッチョイ 4ea0-N8Dk)
垢版 |
2019/01/12(土) 13:40:34.57ID:Cfay/yS40
>>968
あかん。データを壊したくなかったら、別途コピーしたものを渡すべき。
2019/01/12(土) 13:44:47.40ID:7KwgHC6s0
そろそろ次スレ
2019/01/12(土) 14:46:05.16ID:k4bgy+v70
俺の上司とかconstって何?よけいなもんつけんなっていうおじさんだから内政のライブラリは参照でもconst付いてないよ
2019/01/12(土) 15:06:09.76ID:k4bgy+v70
>>986
で、そのリンクリストがパフォーマンス的に勝るデータ量はおいくらだと思ってる?
大きめの画像くらいのサイズならデータの中央に挿入するとき、リンクをたどって挿入するより再確保、再配置した方がシーケンシャルアクセスになるから早いからな
ハードウェアの特性によりシーケンシャルなコピーは相当速いためPythonで一般的に扱う問題では挿入だろうが何だろうがリンクリストが勝ることはまずない
2019/01/12(土) 15:20:37.52ID:T5Trh1u0M
よくリストの特定位置に挿入を繰り返してリンクリストの方が速いというベンチマークがあるけど、あれもほとんど詐欺なんだよな
動的配列に多数の要素を挿入するなら挿入する要素数分ブロックコピーでずらしてから空けた隙間に書き込むだけだからリンクリストより圧倒的に速い
予め要素数が分からない場合は、いったん別の動的配列に追加していってから纏めて挿入すればよい
レス数が950を超えています。1000を超えると書き込みができなくなります。
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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