スレを勃てるまでもないC/C++の質問はここで 25 [隔離病棟]
1 : :2016/08/14(日) 00:04:05.53 ID:z6U1tRVC.net スレを勃てるまでもない低俗なC/C++の質問はここでお願いします。 過去ログ 01 http://pc11.2ch.net/test/read.cgi/tech/1167476845/ 02 http://pc11.2ch.net/test/read.cgi/tech/1178503366/ 03 http://pc11.2ch.net/test/read.cgi/tech/1187521676/ 04 http://pc11.2ch.net/test/read.cgi/tech/1221633708/ 05 http://pc11.2ch.net/test/read.cgi/tech/1230516307/ 06 http://pc11.2ch.net/test/read.cgi/tech/1231564903/ 07 http://pc11.2ch.net/test/read.cgi/tech/1232983248/ 08 http://pc12.2ch.net/test/read.cgi/tech/1235921779/ 09 http://pc12.2ch.net/test/read.cgi/tech/1240022781/ 10 http://pc12.2ch.net/test/read.cgi/tech/1242300936/ 11 http://pc12.2ch.net/test/read.cgi/tech/1245059383/ 12 http://pc12.2ch.net/test/read.cgi/tech/1248010352/ 13 http://pc12.2ch.net/test/read.cgi/tech/1260842197/ 14 http://pc12.2ch.net/test/read.cgi/tech/1269273471/ 15 http://pc12.2ch.net/test/read.cgi/tech/1273368706/ 16 http://hibari.2ch.net/test/read.cgi/tech/1279285647/ 17 http://hibari.2ch.net/test/read.cgi/tech/1285115590/ 18 http://hibari.2ch.net/test/read.cgi/tech/1291571263/ 19 http://hibari.2ch.net/test/read.cgi/tech/1308106024/ 20 http://toro.2ch.net/test/read.cgi/tech/1316013463/ 21 http://toro.2ch.net/test/read.cgi/tech/1342285511/ 22 http://peace.2ch.net/test/read.cgi/tech/1399911167/ 23 http://peace.2ch.net/test/read.cgi/tech/1420379468/ 24 http://echo.2ch.net/test/read.cgi/tech/1448685034/
232 :デフォルトの名無しさん :2017/10/25(水) 13:35:04.89 ID:juMZY67C.net >>231 警告がでてるけどboost::phoenixで通せた https://wandbox.org/permlink/z1PTTryi8XubVbW7
233 :デフォルトの名無しさん :2017/10/25(水) 13:37:35.53 ID:RJdooZ2I.net >>232 超ありがとうございます!(5時間悩んだ)
234 :デフォルトの名無しさん :2017/10/25(水) 13:42:13.44 ID:U6sw7DMu.net 解決してるようだが >>231 for_each(vsz.begin(), vsz.end(), boost::lambda::var(misz)[boost::lambda::_1]++);
235 :デフォルトの名無しさん :2017/10/25(水) 13:53:33.16 ID:RJdooZ2I.net >>234 ありがとうございます! boost::lambda::varの方はVCコンパイラでもビルドできました。 余談ですが、operator[]の代わりにstd::map<>::atを使えないか試してみたのですが こちらは無理そうでした。
236 :デフォルトの名無しさん :2017/10/25(水) 21:59:33.61 ID:U6sw7DMu.net > 余談ですが、operator[]の代わりにstd::map<>::atを使えないか試してみたのですが > こちらは無理そうでした。 ・そもそもmap::atがあるのはc++11以降 ・しかもmap::atはキーが存在しないと例外を投げるから今回みたいな[]の代わりには使えない ・それでやるとしてもboost::lambdaではbindを使わないとできない
237 :デフォルトの名無しさん :2017/10/25(水) 23:22:00.79 ID:RJdooZ2I.net >>236 回答ありがとうございます。 ひそかに.atが使えないか調べていて 一日中やっても駄目だったので諦めたところでした。 自分の環境はVS2012でC++11が部分的に実装されている状況だったため .atがないことに気づきませんでした。すみません。 bindを使う方法はboost::bindやboost::lambda::bind、boost::phoenix::bind と、一通りやってみたのですが自分にはどうやってもコンパイル通りませんでした。
238 :デフォルトの名無しさん :2017/10/25(水) 23:56:46.90 ID:U6sw7DMu.net >>237 https://wandbox.org/permlink/xnDEG9BvF91bvBW7 オーバーロードされてるメンバ関数のポインタを取得しなければなならないのがつまづきどころかな
239 :デフォルトの名無しさん :2017/10/26(木) 00:46:41.57 ID:CxNeOOyi.net >>238 わざわざ調べてくださって本当にありがとうございます。 喉の魚の骨が取れた様な気分です。 キャストは思いつきませんでした。
240 :デフォルトの名無しさん :2017/10/27(金) 04:44:05.29 ID:dgw8O7sr.net 組み込み系ってC++よりもCを使うことが多いと思うが、C++を使うと問題ある? ROM 256Kbyte、Ram 8K位の場合だと、何か注意することある?
241 :デフォルトの名無しさん :2017/10/27(金) 07:05:11.65 ID:kl+AecdR.net C使うことなんてないわ
242 :デフォルトの名無しさん :2017/10/28(土) 00:18:19.01 ID:VLfN62TL.net C すらためらうレベル
243 :デフォルトの名無しさん :2017/10/28(土) 08:50:31.24 ID:5mHtwzGb.net 20年以上前はためらったが今はアセンブラなんてやってられんな 昔はハードに合わせて開発したが、今は開発に合わせてハード選べばいい
244 :デフォルトの名無しさん :2017/10/28(土) 12:37:02.52 ID:siUcDApP.net つかC言語と言っても 直接アセンブラ・ニーモニックを埋め込める インライン機能が用意されてる処理系あるし
245 :デフォルトの名無しさん :2017/10/28(土) 16:13:43.77 ID:5T1YNIdw.net 普通C++だとRAMペースだろ。だから組み込みでRAMが8kとかでは使えないだろな。
246 :デフォルトの名無しさん :2017/11/20(月) 17:48:28.20 ID:HOO1fHXA.net >>244 未だに半角カナ使う奴いたんだ
247 :デフォルトの名無しさん :2017/11/20(月) 23:16:04.54 ID:ste5Kj49.net そりゃISO-2022-JPならともかく、Shift_JISやUnicodeでは正当な文字ですからね。
248 :デフォルトの名無しさん :2017/11/21(火) 06:40:04.61 ID:VCAIytbF.net 変換時の文字幅にまるで無頓着な人が増えた、という話を聞くね。 環境が全面的にプロポーショナルフォントになったことも関係あるかと。 コピーしてペーストして一部書き換え、て手順のせいで 単語中で「半角」「全角」が混在したり、それに気づかなかったり。
249 :デフォルトの名無しさん :2017/11/21(火) 07:02:38.37 ID:f5CXuOxE.net 半角カナに敏感なのって40代、50代以上だよね 未だに2chやってる奴いたんだ
250 :デフォルトの名無しさん :2017/11/21(火) 07:59:10.55 ID:CMMMtcpC.net 1月11日 みたいに一桁は全角2桁は半角ってのもあるな
251 :デフォルトの名無しさん :2017/11/30(木) 13:01:31.93 ID:D3zqdlF5.net OpenMPで#pragma omp sectionsの役目って何なんでしょうか? #pragma omp parallelで並列領域を #pragma omp sectionでスレッド処理(スレッド割当て)単位を 指定することは理解できました。 しかし#pragma omp sectionsが必要となる理由がわかりません。 なぜ必要なんでしょうか? ※ #pragma omp parallel sectionsって書けるみたいですが まぁこれは本質ではないですよね? #include <stdio.h> int main(void) { #pragma omp parallel { #pragma omp sections // ←コンパイラに何を指示してる? { #pragma omp section printf("Hello 1\n"); #pragma omp section printf("Hello 2\n"); #pragma omp section { printf("Hello 3a\n"); printf("Hello 3b\n"); } } } return 0; }
252 :デフォルトの名無しさん :2017/11/30(木) 13:38:08.08 ID:/IB/XhDr.net >>251 https://www.google.com/search?q=%23pragma+omp+sections
253 :デフォルトの名無しさん :2018/01/18(木) 22:17:06.28 ID:fk/Xo3MV.net https://github.com/espressif/esp-idf/blob/master/examples/bluetooth/ble_spp_server/main/ble_spp_server_demo.c の 169 行目からの記述ってどうなっているのか理解したいのですが、 どなたかヒントもらえないでしょうか? 「[SPP_IDX_SVC] = ...」 となっているのが分かりません。
254 :デフォルトの名無しさん :2018/01/18(木) 22:58:14.15 ID:7tNMQ3qD.net >>253 C99 の「指示付きの初期化指定子」かな?
255 :デフォルトの名無しさん :2018/01/18(木) 23:17:40.59 ID:fk/Xo3MV.net >>254 ありがとうございます。理解できました。
256 :デフォルトの名無しさん :2018/01/19(金) 10:36:40.61 ID:dM64lXT0.net シングルトンにするのと、全部クラス変数、クラスメソッドで実装するのと 目的はあまり違わないような気がするんですけど、あえてシングルトンにする意味があれば 教えて頂けないでしょうか?
257 :デフォルトの名無しさん :2018/01/25(木) 15:00:52.20 ID:uboI0CmN.net 質問の意味がわからないが、シングルトンというのはインスタンスを一つしか持たない ということ。クラス変数のようにインスタンスがいくつも作れると誤って2つインスタンス を作ってしまう可能性がある。そうすると本来とは違う変数にアクセスしてしまう恐れが ある。これをさけるんが目的。
258 :デフォルトの名無しさん :2018/01/25(木) 15:45:13.06 ID:O5EWej8a.net >>257 レス有難うございます。 それは、インスタンス変数じゃないでしょうか? クラス変数は同一クラスで共有される静的な変数なのでいくつも作れるものではないと理解しているのですが...
259 :デフォルトの名無しさん :2018/01/25(木) 16:16:27.35 ID:6NNXd/EM.net 微妙に違うけど例えば自分の体重管理アプリを作るとする。「自分」は一人しかいないから、体重を格納する変数だかクラスは1つあればいい 家族の体重管理アプリなら、「家族」は複数だから体重の格納も複数になる こうしたときに自分アプリはシングルトン設計、家族アプリはシングルトンでない設計と「呼んでるだけ」。元々みんなやってたことに専門用語っぽくネーミングしただけだよw
260 :デフォルトの名無しさん :2018/01/25(木) 16:36:48.08 ID:O5EWej8a.net >>259 それ、クラスがシングルトンじゃなくて、データが個人用(単一データ)か複数人用(配列/ディクショナリ)かって話だから、シングルトンとは違うような...
261 :デフォルトの名無しさん :2018/01/25(木) 21:57:47.77 ID:8MUKcewe.net 抽象メソッドにできるというのが一番の利点じゃないかな。
262 :デフォルトの名無しさん :2018/01/25(木) 22:18:47.51 ID:9MCrLTCo.net 組み込み環境に C++ のコードを移植しようとしているんだけど、質問ってここでしていいのかな。 RAM の容量が厳しいので、 Flash にデータを持つように改造したいと思っている。 で、これは、C++ 的には定数でデータを持つだけで実現できるらしい。幸い組み込み環境ではリードオンリーでよい。 普段 PC 環境なら計算量の多いコンストラクタを経て初期化しているあるクラスのインスタンス群を、 PC 環境上で初期化して各フィールドの値をダンプしておいて、 組み込み環境では各フィールドが const になるようにクラスを改造したうえで 何かの方法でコンストラクタをスキップしてやりたい。これでRAMも計算量も減らせたらいい。 思いついた方法は、シリアライザというかコードジェネレーターを用意してソースコード上に定数群をたくさん定義して、 MyType i { cDataA, cDataB, ... }, j { cDataO, cDataP, ... }; のような記述ができるようにする、という感じのもの。 ほかによく使われている方法はある? あるいは、アドレスのキャストか何かでインスタンスの初期化を完了できる黒魔法っぽい方法もあったりする?
263 :デフォルトの名無しさん :2018/01/25(木) 22:22:11.16 ID:9MCrLTCo.net って隔離スレなのか。まあ過去レス見た限りでは答えてくれているようなので… よろしくお願いします。
264 :片山博文MZ :2018/01/25(木) 22:42:32.30 ID:4TKaBAL2.net static char buf[sizeof(MyData)] = { ... }; MyData& data = reinterpret_cast<MyData&>(buf);
265 :片山博文MZ :2018/01/25(木) 22:43:32.46 ID:4TKaBAL2.net static char buf[sizeof(MyData)] = { ... }; MyData& data = *reinterpret_cast<MyData*>(buf);
266 :デフォルトの名無しさん :2018/01/25(木) 23:23:09.67 ID:9MCrLTCo.net ありがとう { ... } の部分をプログラムからうまく生成する方法はなにかあるだろうか?
267 :デフォルトの名無しさん :2018/01/25(木) 23:28:29.97 ID:9MCrLTCo.net キャストで済んでいるのはとてもよさそうだけど、 PC 環境でのメモリ上での表現と組み込み環境でのメモリ上の表現は完全に一致するのだろうか。 アライメントというものがあるんだったような
268 :片山博文MZ :2018/01/25(木) 23:29:12.87 ID:4TKaBAL2.net unsigned char *pb = reinterpret_cast<unsigned char *>(&data); for (size_t i = 0; i < len; ++i) printf("%02X, ", pb[i]);
269 :片山博文MZ :2018/01/25(木) 23:32:26.13 ID:4TKaBAL2.net char *pch = reinterpret_cast<char*>(&data); for (size_t i = 0; i < len; ++i) printf("%02X, ", (*pch & 0xFF));
270 :片山博文MZ :2018/01/25(木) 23:33:19.76 ID:4TKaBAL2.net pch[i] & 0xFF
271 :デフォルトの名無しさん :2018/01/25(木) 23:46:29.85 ID:9MCrLTCo.net まそうですよね。再びありがとう。 アライメントについては各環境で実験して (offsetof(MyData, ...) が一致するか) いけそうなら試してみる。 エンディアンとアライメント(バイト境界)が一致してればきっと大丈夫だよね
272 :デフォルトの名無しさん :2018/01/25(木) 23:59:52.47 ID:9MCrLTCo.net 助かる、これでとんかつ定食でも食べてくれ っ [ぺいぱる]
273 :デフォルトの名無しさん :2018/01/27(土) 10:10:18.54 ID:EckHRazm.net floatを実数Xで初期化する際にfloatではその数を正確に表現できない場合、少し大きいか小さいかでXに近い値になると思います そういう正確には表せない場合に、どうすれば初期化される値がXを下回らない最小の値となるようにできますか? たとえば√3(1.7320508075688...)で初期化しようと float x=1.7320508075688f; と書くと xの値が1.732050776となり√3より小さくなってしまうので、そういうのを避けたいです
274 :デフォルトの名無しさん :2018/01/27(土) 10:43:57.22 ID:BU9rpSw9.net 精度上げたいならdouble使えば?
275 :デフォルトの名無しさん :2018/01/27(土) 11:40:33.40 ID:2gTl4aTp.net >>273 C/C++の標準機能では無理な気がする というか、無理関数や超越関数でそういう丸め方が出来るアルゴリズムってあるのかな? 高精度で求めてから丸めるしかないような気がするが 運が悪いとそれでも下回らない最小にはならない
276 :デフォルトの名無しさん :2018/01/27(土) 11:42:00.24 ID:2gTl4aTp.net 定数何個かなら事前に計算していれておけば良いけど
277 :デフォルトの名無しさん :2018/01/27(土) 11:52:04.54 ID:BU9rpSw9.net そういう意味ではPython最強だな
278 :デフォルトの名無しさん :2018/01/27(土) 11:53:27.06 ID:EckHRazm.net 言葉足らずでしたが、標準やその他ライブラリの数学関数の結果として求めたいのではなく 数値リテラルとして初期化する場合に限ってもらっても結構です 閾値として使うのに、切り上げか切り下げかわかっていないと間違った結果が出て後で困ることになります たとえば単純に閾値未満と以上のデータを別の用紙に印刷するプログラムを以下のように書いた場合 double result = calculation(); double threshold = √3 if (result < threshold) fail_list.add(result); else pass_list.add(result);` print_to_paper(fail_list); print_to_paper(pass_list); 計算精度に限界がある以上(閾値付近での)比較での細かい誤差は気にするなという人もいるでしょうが それ以上に実際に紙面に載る値が要件に反する事態になってしまうと後々困ったことになるのです... >>276 次善の策でそのことも考えますが、要件が変わった場合などに脆さが残りませんか?
279 :デフォルトの名無しさん :2018/01/27(土) 12:07:53.57 ID:BU9rpSw9.net 閾値も比較対象も同じ精度なら不都合は起きない気がするけど 不都合が起きるとすると、計算過程での誤差が許容範囲内かどうかってことじゃないの? どっちにしても無理数はどっが切らないといけないわけだし、扱える有効桁数の範囲で計算するしかない ちなみに、 float x=1.7320508075688f; は、代入の時点でfloatの有効桁数を超えてるから表示した時の結果と異なるのは当たり前 doubleだと有効桁数が15〜16桁程度ある。それでも不足なら、long doubleを使うとか、decimal型 を扱う外部ライブラリを使うとか
280 :デフォルトの名無しさん :2018/01/27(土) 12:23:14.67 ID:x9sgfrz+.net (v-1ULP) <= X < v となるvを選びたいということかね? その方法は知らんが、常に (v-1ULP) <= X < v か (v-1ULP) < X <= v のどちらかなわけだから 別に問題ないんでは?X≒vを上に組み入れるか下に組み入れるか決めりゃいいだけで。
281 :デフォルトの名無しさん :2018/01/27(土) 14:20:38.41 ID:EckHRazm.net 説明のために>>278 のプログラムをfloatに戻したものを考えると (result < 1.732050776f)という比較ではresultが1.732050776fだった場合に 1.732050776は√3未満であるのに合格リストの方に載ってしまうということです 計算上の誤差があるとかdoubleの有効桁数が多いとかでなく プログラム内の数値の取り扱いに関係なく、実際の紙の上では間違いが起こってほしくないということです うまく説明できてるかどうかわかりませんが、実行時どの程度誤差を許容できるかは問題ではないんです 結果を見せた時に、どうしてこの値がこっちのリストに載っているわけ? 直しておいてくれる? と言われれば、どうせ境界値付近の値なんてどちらのリストに載っていようと計算誤差もあるしいずれにしても正確とは言えないんですよ では通じないんです... ≒をどちらに組み込むかを決めておくというのも、結局は事前に求めておく>>276 の手法と同じ手間がかかりませんか 要件の数値(実数)が変われば、切り上げか切り下げのどちらであるかも変わってしまいますから どちらになっているかを確かめなくてはいけないですよね
282 :デフォルトの名無しさん :2018/01/27(土) 14:34:58.54 ID:BU9rpSw9.net そもそも、 1.732050776f と言う書き方が矛盾してでしょ 末尾にfをつけてるから、floatに変換してるわけだけど、1.732050776 はfloatの有効桁数を超えた表現だからこの比較自体がおかしい 1.732050776 と比較したかったらdoubleで計算すればいいし、もっと大きな有効桁数を求めるなら、long doubleなり、decimal型を扱えるライブラリでも使えばいい
283 :デフォルトの名無しさん :2018/01/27(土) 14:55:39.92 ID:EckHRazm.net 1.732050776と比較したいのではなく√3です(√3という数も説明の便宜上です念のため) ですからdouble型でも√3が表現できないのは変わらない以上は floatをdoubleにしても問題の起こりやすさが減るだけで起こることに変わりないと思います doubleを使うなら1.7320508075688...よりも多くの桁数を書くことになるというだけです(20桁以上?)... 私の場合有効桁数そのものが問題なのではなく、切り上げか切り下げを指定したいということです あるいはどちらが行われているかがわかればそれで問題ありません(と思います) 加えるとほかの工程に渡す必要があるためdecimal等をサポートするライブラリの使用は非常に厳しいです
284 :片山博文MZ :2018/01/27(土) 15:09:28.15 ID:TUhH5TnV.net 小さかったら、FLT_MIN / 2を繰り返し足せばいいんとちゃう?
285 :デフォルトの名無しさん :2018/01/27(土) 15:16:35.83 ID:x9sgfrz+.net >私の場合有効桁数そのものが問題なのではなく、切り上げか切り下げを指定したいということです それならその√3を求める関数の仕様に当たるべきでは。 標準の数学関数だと、丸め方式以前に1ULPの誤差も保証されているとは限らない。
286 :デフォルトの名無しさん :2018/01/27(土) 15:18:36.43 ID:BU9rpSw9.net >>283 √3との比較対象となる計算結果も、floatなりdoubleなりを使う計算過程で桁落ちは発生するでしょ? そっちは問題ないの? 閾値となる√3の桁落ちだけが問題? なんにしろ、√3みたいな無理数を扱う場合は、有効桁数何桁、少数点以下何桁まで考慮するという前提がないと、それを扱う型の精度も決められないし、それがデータ設計者の役目だと思うけど
287 :片山博文MZ :2018/01/27(土) 15:21:29.73 ID:TUhH5TnV.net ルート3に相当する数値を2乗して、3以上になればいいんだろ?
288 :デフォルトの名無しさん :2018/01/27(土) 15:28:05.15 ID:BU9rpSw9.net >>287 √3と言うのは例として上げただけで平方根とは限らないみたいだよ
289 :片山博文MZ :2018/01/27(土) 15:56:37.17 ID:TUhH5TnV.net 逆算して、不等式を満たすかチェックすれば?
290 :デフォルトの名無しさん :2018/01/27(土) 16:35:32.82 ID:2gTl4aTp.net >>281 丸める前の値は何? 文字列?double?数式?
291 :デフォルトの名無しさん :2018/01/27(土) 16:37:26.51 ID:2gTl4aTp.net >>289 数学や数値計算の素人はだまってなさい
292 :デフォルトの名無しさん :2018/01/27(土) 16:54:03.59 ID:EckHRazm.net >>290 元データは文字列で、最大で有効数字8桁くらいの10進数の小数点数です それを単にstrtofで読みこんで、計算過程もずっとfloatです ですけど読み込み時の誤差も含めて計算誤差は特に問題にしなくてもかまいません それこそ計算誤差があるから仕方ないで押し通すこともできると思います ですが、計算結果を2つのグループに分ける際に、実数の閾値に対して忠実でなければならないということです >>286 閾値も計算の精度も32ビットのfloatで問題ないです なので閾値となるfloat値を事前計算すれば、とりあえずは済みます (ですが事後の変更に備えて、安全な方策がないものかと思い始めたわけです) >>285 閾値は実行時に関数を呼び出して計算する必要はありません 単に計算機で求めた桁の多い数字を使って意図通りにfloatを初期化できれば問題は解決です
293 :デフォルトの名無しさん :2018/01/27(土) 17:02:29.66 ID:BU9rpSw9.net >>292 32ビットfloatの有効桁数は7桁しかないよ √3は、小数部6桁の1.732051 までしか表現できないし、 例えば整数部の最大を4桁としたら、小数部は3桁までしか使えない 大丈夫?
294 :デフォルトの名無しさん :2018/01/27(土) 17:16:55.11 ID:RR6n96sQ.net >>291 無理数を定数値とする方法は無いから片山の意見は一理ある
295 :デフォルトの名無しさん :2018/01/27(土) 17:29:56.29 ID:RraDQJG1.net 使ってる環境のfloatのビット表現を確認して、それで誤差なく表現できる閾値以下の最大の数値を求めて、それを定数として閾値にすればいいんでないの?
296 :デフォルトの名無しさん :2018/01/27(土) 17:33:27.63 ID:2gTl4aTp.net 元の10進数の文字列に対して、 これを下回らない最小のfloatの値 これを上回らない最大のfloatの値 を求めれば良いの? 仕様をはっきりして
297 :デフォルトの名無しさん :2018/01/27(土) 17:45:09.91 ID:2gTl4aTp.net floatの値と10進数文字列の大小比較が出来れば良い?
298 :デフォルトの名無しさん :2018/01/27(土) 17:48:38.55 ID:2gTl4aTp.net √3やsin(1+√2)などの数式が示す値とfloatの大小比較?
299 :デフォルトの名無しさん :2018/01/27(土) 18:07:06.21 ID:2gTl4aTp.net 数式って言うと誤解を与えるのかな? 10進数表記可能な数値 数学的に定義可能な実数 それ以外 閾値はどれ?
300 :デフォルトの名無しさん :2018/01/27(土) 18:28:25.65 ID:EckHRazm.net >>293 はい、それで問題ありません 上であげた√3の例は計算機で出してfloatには十分だと思える桁数で切っているだけです 入力データや計算誤差自体には許容的です >>296 閾値の数は文字列から取得するわけではありません ソースコード中のリテラル値として与えられるもので構いません 求めるものは、単純化して言うと プログラム上のあるfloat値が、数学的な意味での実数X未満であるかそうでないかのbool値になります >>299 10進数表記可能な数ということになります たとえば√3も関数電卓などで求めた値で十分(20桁もあればfloatには十分すぎるだろう)という意味です
301 :デフォルトの名無しさん :2018/01/27(土) 19:52:43.68 ID:BU9rpSw9.net >>300 floatの有効桁数は7桁だから float x=1.7320508075688; とするんじゃなくて、 float x = 1.732051; とするしかないでしょ それが嫌なら、もっと精度の高いdoubleを使うようにして double x = 1.7320508075688; として、これを閾値とすればいい そして、そのことを予め顧客に確認しておけばいい 扱うデータの桁数を予め決めておくことは設計時の重要事項でしょ 何も問題は無いと思うけど、何を悩んでるのか分からない。 もし無理数を無理数のまま無制限の精度で扱いたいなら、もうそういうライブラリを使うしかない あるのか知らんけど
302 :デフォルトの名無しさん :2018/01/27(土) 20:13:29.55 ID:EckHRazm.net >>301 スレを後から読んだ人に混乱を広げないために念のために書いておきますが、無理数を無理数として扱う必要はありません ついでに、計算の精度を高めたいわけでもありません あらかじめ閾値になるfloat値を求めておけば済むというのはわかりますその通りです 早い段階で気づいていました ですがそれだけだと変更に弱いですよね 実際に書き換えるのが三か月後の自分か赤の他人になるのかはわかりませんが だれかの手作業で閾値のfloat値を再計算するより信頼性のある方法があれば、ということで質問を始めました ただ5レス目しないうちから簡単には済まないだろうなとも思っていました
303 :デフォルトの名無しさん :2018/01/27(土) 20:14:24.46 ID:tkKoYj6x.net だなー float基準なんだからdoubleでもっときゃいい。これがdoubleでーってなってたら悩むがw
304 :デフォルトの名無しさん :2018/01/27(土) 20:42:46.77 ID:EckHRazm.net doubleで持つ考えもわかります ただfloatの丸め方がわかれば(あるいは制御できれば)問題は解決(>>303 が悩むdoubleが必要な時にも拡張できる方法)だと思うのですが... その方法が簡単でないということが分かったことは収穫...?でした
305 :デフォルトの名無しさん :2018/01/27(土) 20:56:05.82 ID:tkKoYj6x.net floatの丸め方が分かったら、それを求めるために(floatが32ビット型だとしたら最低でも)33ビットで計算しないといけなくなるわけでしょ? つまりは33ビット型を新たに作ることになるわけで・・・だったら最初からある64ビット型を使たほうがってw
306 :デフォルトの名無しさん :2018/01/27(土) 21:11:10.44 ID:EckHRazm.net 実行時の精度ではなく、コンパイラがソースコード中の数値文字列をどう機械語(float型)に翻訳するかということではないですか? ソースコード上では20桁もある数値文字列を実際にコンパイラが適切な32ビット型に変換しているので 33ビット型とかいう変な方を導入するまでもないと思うのですが 実行時に実数がどうまとめられたかを知りたいわけじゃないんです 初期化式の右辺に来る数値リテラルをコンパイラ内部で何ビットで処理しようが関係ありませんよね? 実行時にfloatやdouble値の実体を持つ閾値が、切り下げられたか切り上げられたかを判断するのであれば 33ビットの浮動小数点数型が必要になるでしょうけども...
307 :デフォルトの名無しさん :2018/01/27(土) 21:11:56.87 ID:BU9rpSw9.net >>304 floatの丸め方が知りたかったの? round、floor, ceil とかあるじゃん 例えば、double型の小数部第6位で切り捨ててfloat型へ代入したければ、ありがちなやり方としては double d = 1.7320508075688; float f = floor(d * 100000.0) / 100000.0; んな感じで
308 :デフォルトの名無しさん :2018/01/27(土) 22:03:45.49 ID:EckHRazm.net 実行時の変数の丸め方ではありませんよ 丸めという言葉はよくなかったかもしれませんすみませんでした 今はfloatの初期化式を書いた時にコンパイラがどう振舞うかということの意味です それと前に10進数表記可能な数と書いたのは、単にソースコード上で そう書き表すことのできる(√とかsinとかその他を使わない)数という意味で 10進数の数のある桁で四捨五入するという意味ではありませんでした 丸めという言葉もULPに対するものとして言ってるつもりでした >>280 で出てるのでこちらから出しませんでしたが言葉足らずでした重ねてすみまんせん 元々は1.7777777fupとか1.7777777fdownとか(桁数や表記法はともかく) お手軽に意図通りの値に初期化できないものかと考えて質問しました そうすれば、実数から浮動小数点数への翻訳方法(コンパイラによる切り上げ切り下げ)にかかわらず、 ソースコード上に記述されている通りの、数学的な大小関係を損なわないプログラムが書けると考えたからでした 次にいつここへ来るかわからないので今日の私の質問はこれで終わりにします 返答してくれた人たちは本当にありがとうございました
309 :デフォルトの名無しさん :2018/01/28(日) 01:49:55.74 ID:x3ZlVnQ6.net 2進数の小数リテラルの記述が出来るようになるんじゃなかった? なんで今まで出来なかったのかが不思議だけど それで満足なのか? 小数のリテラルの、コンパイル時の文字列から値への変換は 普通はその文字列が表す値に一番近い値になる 丸め方を自分で決めたければ、文字列から数値に変換するconstexpr関数を作れば良い
310 :デフォルトの名無しさん :2018/01/28(日) 10:42:15.33 ID:YQxX9lfa.net 2進で書いたってなんの解決にもならんよwww リテラルのみだとしても結局はdouble分の計算が必要でしょ。計算するのがコンパイル前でも構わなくなるってだけ
311 :デフォルトの名無しさん :2018/01/28(日) 11:03:46.96 ID:Y4YkWHjI.net 二進できっちり仮数部23bitで書けばいいだろう それなら1ULP未満切り捨てになる
312 :デフォルトの名無しさん :2018/01/28(日) 11:14:12.99 ID:YQxX9lfa.net やりたいことは、その切り捨てがあるなら切り上げたいってことでしょ だから切り捨てがあるかないかを事前に計算する必要ある
313 :デフォルトの名無しさん :2018/01/28(日) 11:31:33.17 ID:Y4YkWHjI.net >やりたいことは、その切り捨てがあるなら切り上げたいってことでしょ どこをどう読んだらそうなる >>283 は切り上げか切り捨てかどちらか特定できればいいって書いてるだろ
314 :デフォルトの名無しさん :2018/01/28(日) 11:51:46.98 ID:YQxX9lfa.net > floatを実数Xで初期化する際にfloatではその数を正確に表現できない場合、少し大きいか小さいかでXに近い値になると思います > そういう正確には表せない場合に、どうすれば初期化される値がXを下回らない最小の値となるようにできますか? これを読んだらそうなる。特定したらこれが解決するでしょ。その解決のために計算が必要になる
315 :デフォルトの名無しさん :2018/01/28(日) 12:11:57.99 ID:Y4YkWHjI.net そこしか読まないからそうなる その後のレスでどちらでもよいと補足しているだろう
316 :デフォルトの名無しさん :2018/01/28(日) 12:20:06.50 ID:Y4YkWHjI.net というか、 >2進で書いたってなんの解決にもならんよwww これが否定されたのがそんなに我慢ならなかったのか
317 :デフォルトの名無しさん :2018/01/28(日) 13:17:58.45 ID:YQxX9lfa.net > double分の計算が必要 むしろこっち否定しろよw
318 :デフォルトの名無しさん :2018/02/01(木) 14:07:29.89 ID:BjxdiDzB.net 二進リテラルでええやろ それかstd::nextafterで切り上げるか切り下げるか
319 :デフォルトの名無しさん :2018/02/01(木) 20:59:41.19 ID:uG0JSReu.net 二進リテラルはいいが、nextafterはちょい違うな。
320 :デフォルトの名無しさん :2018/02/02(金) 10:30:51.76 ID:ahF+s6Dw.net 2進小数を10進小数に変換出来るツールの提供と リテラル記述箇所へのコメント 現実的な解はこの辺かと
321 :デフォルトの名無しさん :2018/02/02(金) 12:14:54.40 ID:NAEfRvIa.net そういう設計にするとバグ出まくり。しかも発見が非常に困難 普通に仮数部足す関数作ってそれかましておけばいいでしょ
322 :デフォルトの名無しさん :2018/02/02(金) 13:00:05.92 ID:ahF+s6Dw.net 足す? 何を? どうやって?
323 :デフォルトの名無しさん :2018/02/02(金) 13:15:59.60 ID:NAEfRvIa.net 力技でビット演算してもいいし、仮数部1ビットだけ建てたの用意して普通に加算してもいいでしょ
324 :デフォルトの名無しさん :2018/02/09(金) 16:44:31.74 ID:9b+Wa+Ns.net hoge(int *) という関数があり、hoge(&a) とすれば a に値を返す仕組みとします。 ここで、char a をキャストして hoge((int *)&a) として実行した場合、意図した結果が返されない ケースがあるのはいいとして、他に問題はありますか? 例えば、hoge()自身は渡されたものが int のポインターなんだから char 以上のメモリー範囲を 超えて書き込むからメモリーが破壊されるといったことが起こりますか?
325 :片山博文MZ :2018/02/09(金) 17:01:41.47 ID:owaGciqs.net >>324 最適化を無効にして char ab = 0x7F; char a; char aa = 0x7F; hoge((int*)&a); printf("%d, %d, %d\n", ab, a, aa); で試してみて。
326 :デフォルトの名無しさん :2018/02/09(金) 17:32:12.48 ID:9b+Wa+Ns.net >>325 既に稼働してるシステムで上記の箇所を見つけはしたものの、何食わぬ顔をして動いていたので 疑問に感じていましたが、新規プロジェクトで試したら一発でしたね。 スタックオーバーフローでした。 どうもありがとうございました。
327 :デフォルトの名無しさん :2018/02/09(金) 20:59:14.12 ID:9QnGJOcV.net >>324 条件によっちゃよくやる 例えば char a,b,c,d; こんなのでaのアドレスに対してint読み出しかけて、abcdくっつけたint16値を取り出すとか その逆にint16値をaにキャストしてabcd個別にアクセスとか ただ連続したメモリ空間に入らないことがあるから、 その辺はstructでまとめたり、pragma packやら何やらで指定しとくとか、プラットフォームとコンパイラに合わせる
328 :デフォルトの名無しさん :2018/02/10(土) 09:55:27.64 ID:sEVENX79.net >>327 横からでごめんやけど int nとchar a,b,c,d,x[12]をunionってのはやら無い方がよさげ?
329 :デフォルトの名無しさん :2018/02/10(土) 10:44:47.90 ID:A/uZfZpr.net unionで書いたほうがスマートなこともあるな。その逆なこともある 動作自体は何使っても同じだから、ソースの見やすさやclass設計考えながら選択したらいい
330 :デフォルトの名無しさん :2018/02/16(金) 01:33:43.00 ID:Ja2iVc8/.net 構造体の、一部のみゼロ埋めする方法を知りたいです CコンパイラはMingw-win32のgcc 6.3.0を使ってます struct aaa_tag{ uint32_t a; uint32_t b; uint32_t c; : uint32_t z; } という構造体に、fread(&aaa, sizeof(aaa), 1, fp)でファイルから値を読み込んでいるのですが 実は構造体としてファイルから読み込むべきサイズが条件により変える必要があります 例えば以下のようにです ・bが1の場合は有効なのはaとbのみ。c以降の値はゼロで書き戻す ・bが5の場合は有効なのはa〜wまで。x以降の値はゼロに書き戻す まずbを読んで、それから必要なサイズを読み出す…も考えたのですがそうではなく、 構造体の途中以降をゼロクリアしようと思っているのですが、これがうまくいきません if (b == 1)memset(&aaa + sizeof(uint32_t) * 2, 0x00, sizeof(aaa) - sizeof(uint32_t)); 等と試行錯誤しているのですが、SIGSEGVが出てしまいます 解決法を教えていただけますか
331 :片山博文MZ :2018/02/16(金) 06:04:46.72 ID:tdYV0Px7.net 上から順番に読み込むか、fseekで読み込み位置まで移動してから読み込む。 位置はoffsetofとかFIELD_OFFSETという名前のマクロを使う。そのようなマクロがない場合は自作する。 読み込むときは、位置とバイトサイズによく注意すること。また、NULLや無効な場所に読み込んではいけない。
332 :デフォルトの名無しさん :2018/02/16(金) 06:11:24.04 ID:W1XJdyx1.net ☆ 日本の、改憲を行いましょう。現在、衆議員と参議院の 両院で、改憲議員が3分の2を超えております。 『憲法改正国民投票法』、でググってみてください。国会の発議は すでに可能です。平和は勝ち取るものです。お願い致します。☆☆
126 KB
新着レスの表示
掲示板に戻る
全部
前100
次100
最新50
read.cgi ver 2014.07.20.01.SC 2014/07/20 D ★
本文 スレッドタイトル 投稿者