スレを勃てるまでもないC/C++の質問はここで 25 [隔離病棟]©2ch.net
>>298
floatの有効桁数は7桁だから
float x=1.7320508075688;
とするんじゃなくて、
float x = 1.732051;
とするしかないでしょ
それが嫌なら、もっと精度の高いdoubleを使うようにして
double x = 1.7320508075688;
として、これを閾値とすればいい
そして、そのことを予め顧客に確認しておけばいい
扱うデータの桁数を予め決めておくことは設計時の重要事項でしょ
何も問題は無いと思うけど、何を悩んでるのか分からない。
もし無理数を無理数のまま無制限の精度で扱いたいなら、もうそういうライブラリを使うしかない
あるのか知らんけど >>299
スレを後から読んだ人に混乱を広げないために念のために書いておきますが、無理数を無理数として扱う必要はありません
ついでに、計算の精度を高めたいわけでもありません
あらかじめ閾値になるfloat値を求めておけば済むというのはわかりますその通りです
早い段階で気づいていました
ですがそれだけだと変更に弱いですよね
実際に書き換えるのが三か月後の自分か赤の他人になるのかはわかりませんが
だれかの手作業で閾値のfloat値を再計算するより信頼性のある方法があれば、ということで質問を始めました
ただ5レス目しないうちから簡単には済まないだろうなとも思っていました だなー
float基準なんだからdoubleでもっときゃいい。これがdoubleでーってなってたら悩むがw doubleで持つ考えもわかります
ただfloatの丸め方がわかれば(あるいは制御できれば)問題は解決(>>301が悩むdoubleが必要な時にも拡張できる方法)だと思うのですが...
その方法が簡単でないということが分かったことは収穫...?でした floatの丸め方が分かったら、それを求めるために(floatが32ビット型だとしたら最低でも)33ビットで計算しないといけなくなるわけでしょ?
つまりは33ビット型を新たに作ることになるわけで・・・だったら最初からある64ビット型を使たほうがってw 実行時の精度ではなく、コンパイラがソースコード中の数値文字列をどう機械語(float型)に翻訳するかということではないですか?
ソースコード上では20桁もある数値文字列を実際にコンパイラが適切な32ビット型に変換しているので
33ビット型とかいう変な方を導入するまでもないと思うのですが
実行時に実数がどうまとめられたかを知りたいわけじゃないんです
初期化式の右辺に来る数値リテラルをコンパイラ内部で何ビットで処理しようが関係ありませんよね?
実行時にfloatやdouble値の実体を持つ閾値が、切り下げられたか切り上げられたかを判断するのであれば
33ビットの浮動小数点数型が必要になるでしょうけども... >>302
floatの丸め方が知りたかったの?
round、floor, ceil とかあるじゃん
例えば、double型の小数部第6位で切り捨ててfloat型へ代入したければ、ありがちなやり方としては
double d = 1.7320508075688;
float f = floor(d * 100000.0) / 100000.0;
んな感じで 実行時の変数の丸め方ではありませんよ
丸めという言葉はよくなかったかもしれませんすみませんでした
今はfloatの初期化式を書いた時にコンパイラがどう振舞うかということの意味です
それと前に10進数表記可能な数と書いたのは、単にソースコード上で
そう書き表すことのできる(√とかsinとかその他を使わない)数という意味で
10進数の数のある桁で四捨五入するという意味ではありませんでした
丸めという言葉もULPに対するものとして言ってるつもりでした
>>278で出てるのでこちらから出しませんでしたが言葉足らずでした重ねてすみまんせん
元々は1.7777777fupとか1.7777777fdownとか(桁数や表記法はともかく)
お手軽に意図通りの値に初期化できないものかと考えて質問しました
そうすれば、実数から浮動小数点数への翻訳方法(コンパイラによる切り上げ切り下げ)にかかわらず、
ソースコード上に記述されている通りの、数学的な大小関係を損なわないプログラムが書けると考えたからでした
次にいつここへ来るかわからないので今日の私の質問はこれで終わりにします
返答してくれた人たちは本当にありがとうございました 2進数の小数リテラルの記述が出来るようになるんじゃなかった?
なんで今まで出来なかったのかが不思議だけど
それで満足なのか?
小数のリテラルの、コンパイル時の文字列から値への変換は
普通はその文字列が表す値に一番近い値になる
丸め方を自分で決めたければ、文字列から数値に変換するconstexpr関数を作れば良い 2進で書いたってなんの解決にもならんよwww
リテラルのみだとしても結局はdouble分の計算が必要でしょ。計算するのがコンパイル前でも構わなくなるってだけ 二進できっちり仮数部23bitで書けばいいだろう
それなら1ULP未満切り捨てになる やりたいことは、その切り捨てがあるなら切り上げたいってことでしょ
だから切り捨てがあるかないかを事前に計算する必要ある >やりたいことは、その切り捨てがあるなら切り上げたいってことでしょ
どこをどう読んだらそうなる
>>281は切り上げか切り捨てかどちらか特定できればいいって書いてるだろ > floatを実数Xで初期化する際にfloatではその数を正確に表現できない場合、少し大きいか小さいかでXに近い値になると思います
> そういう正確には表せない場合に、どうすれば初期化される値がXを下回らない最小の値となるようにできますか?
これを読んだらそうなる。特定したらこれが解決するでしょ。その解決のために計算が必要になる そこしか読まないからそうなる
その後のレスでどちらでもよいと補足しているだろう というか、
>2進で書いたってなんの解決にもならんよwww
これが否定されたのがそんなに我慢ならなかったのか > double分の計算が必要
むしろこっち否定しろよw 二進リテラルでええやろ
それかstd::nextafterで切り上げるか切り下げるか 二進リテラルはいいが、nextafterはちょい違うな。 2進小数を10進小数に変換出来るツールの提供と
リテラル記述箇所へのコメント
現実的な解はこの辺かと そういう設計にするとバグ出まくり。しかも発見が非常に困難
普通に仮数部足す関数作ってそれかましておけばいいでしょ 力技でビット演算してもいいし、仮数部1ビットだけ建てたの用意して普通に加算してもいいでしょ hoge(int *) という関数があり、hoge(&a) とすれば a に値を返す仕組みとします。
ここで、char a をキャストして hoge((int *)&a) として実行した場合、意図した結果が返されない
ケースがあるのはいいとして、他に問題はありますか?
例えば、hoge()自身は渡されたものが int のポインターなんだから char 以上のメモリー範囲を
超えて書き込むからメモリーが破壊されるといったことが起こりますか? >>322
最適化を無効にして
char ab = 0x7F;
char a;
char aa = 0x7F;
hoge((int*)&a);
printf("%d, %d, %d\n", ab, a, aa);
で試してみて。 >>323
既に稼働してるシステムで上記の箇所を見つけはしたものの、何食わぬ顔をして動いていたので
疑問に感じていましたが、新規プロジェクトで試したら一発でしたね。
スタックオーバーフローでした。
どうもありがとうございました。 >>322
条件によっちゃよくやる
例えば
char a,b,c,d;
こんなのでaのアドレスに対してint読み出しかけて、abcdくっつけたint16値を取り出すとか
その逆にint16値をaにキャストしてabcd個別にアクセスとか
ただ連続したメモリ空間に入らないことがあるから、
その辺はstructでまとめたり、pragma packやら何やらで指定しとくとか、プラットフォームとコンパイラに合わせる >>325
横からでごめんやけど
int nとchar a,b,c,d,x[12]をunionってのはやら無い方がよさげ? unionで書いたほうがスマートなこともあるな。その逆なこともある
動作自体は何使っても同じだから、ソースの見やすさやclass設計考えながら選択したらいい 構造体の、一部のみゼロ埋めする方法を知りたいです
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が出てしまいます
解決法を教えていただけますか 上から順番に読み込むか、fseekで読み込み位置まで移動してから読み込む。
位置はoffsetofとかFIELD_OFFSETという名前のマクロを使う。そのようなマクロがない場合は自作する。
読み込むときは、位置とバイトサイズによく注意すること。また、NULLや無効な場所に読み込んではいけない。 ☆ 日本の、改憲を行いましょう。現在、衆議員と参議院の
両院で、改憲議員が3分の2を超えております。
『憲法改正国民投票法』、でググってみてください。国会の発議は
すでに可能です。平和は勝ち取るものです。お願い致します。☆☆ >>328
セグメンテーションフォールトを起こす直接の原因は、
memset() の第1引数 &aaa + sizeof(uint32_t) * 2 の部分だろうね。
printf("%p\n", &aaa);
printf("%p\n", &aaa.c);
printf("%p\n", &aaa + sizeof(uint32_t) * 2);
上の3行の出力を比較検討すると理屈が分かると思うけど説明は長くなる。
というか、俺にはポインタ加算について短く平易に説明する能力がない。
#include <stddef.h> // offsetof()マクロの定義
if (b == 1)memset(&aaa.c, 0x00, sizeof(aaa) - offsetof(struct aaa_tag, c);
で動くと思うけど、
ダミーの構造体に読み込んでから、bの値を見て有効な部分だけ
(あらかじめ0クリアしておいた)返却用の構造体にコピー、とする方が素直かも。 カッコの対応が合ってないね。
× if (b == 1)memset(&aaa.c, 0x00, sizeof(aaa) - offsetof(struct aaa_tag, c);
○ if (b == 1)memset(&aaa.c, 0x00, sizeof(aaa) - offsetof(struct aaa_tag, c)); 328です
皆様情報ありがとうございました
構造体先頭から末尾までのmemsetとは事情が違うということが分かりました
offsetof()やダミーの構造体など、方針を見直します
ありがとうございました だからアラインメントでぐぐれって・・・
それむこうにすればできるから 328のセグフォはアドレスとポインタの違いが分からない時にやらかすミス アライメント無視して詰め込むとミスってバスエラーになるからやらないな >>335
>>328のケースではアラインメントを無効化してもダメだろうよ >>335
アライメントについては、OS、アプリ共に32ビットであり、
メンバも32ビットに揃える(パディングはさせない)ように
考慮されてはいるので、無効にしてみましたが変化はなさそうです
__attribute__ ((packed))付与有無でsizeof(aaa)としてみましたが、
どちらも4バイト×メンバ数となり、やぱりパディングは
されていないのかなと
>>336
構造体は、パディングに関わらず先頭以外の場所へmemsetやmemcpyで
触ってはならないのだろう、という思いに至り、方針を見直そうと思ったのですが
実際、書くとしたらどう書くことになるのでしょう
例えば、a〜zまで並べられているメンバ中、cからyまでゼロで埋める…みたいなので… >>340
構造体の途中をmemcpyとかで書き換えるのは問題ないよ。
>>331も指摘しているとおり、元のコードの問題はアドレスの計算が間違っていること。
&aaa+1なら、aaaの先頭アドレスに1を足した値ではなく、aaaの先頭アドレスにsizeof(aaa)を1つ分足した値になるよ。 C#の質問なのですがスレが他に無いのでここで質問させてください。
VisualStudio2017でDLLの作成をしようと思っています。
DLLプロジェクトのなかでSystem.ConsoleやSystem.IO.Pathクラスを使用したいのですができません。
「現在のコンテキストに 'Path' という名前は存在しません。」というエラーです。
コンソールアプリのプロジェクトなら問題なく使用できます。
どうすればDLLのプロジェクトでも使用できるようになりますか? ふらっと C#,C♯,C#(初心者用) Part135
ttps://mevius.5ch.net/test/read.cgi/tech/1517749348/
C#, C♯, C#相談室 Part95
ttps://mevius.5ch.net/test/read.cgi/tech/1508180530/
あたりじゃダメなん? >>344
すみません検索の仕方を間違えていたようです;;
そちらで質問させていただきます!お手数おかけしました。 僕の知り合いの知り合いができたパソコン一台でお金持ちになれるやり方
役に立つかもしれません
グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』
17PZB c++のライブラリでこれと言った具体例ではないのですかマニュアル通りにやってもissueを見ても上手く動かせないものがあります
そういう時はどういう様に解決すれば良いのでしょうか?
おすすめのデバッグ方法などがあればよろしくお願いします 使用をあきらめる
とことん追う
コードを公開して助けを得る >>348
今までは使用を諦めていました
ライブラリごとにいちいち聞くのもあれなのでとことん追いたいなと思います
その追い方について何かアドバイスをもらえませんか? IDEを使ってビルド・ステップ実行すれば、素人でも実行の様子を観察できる。ただし、GUIのあるプログラムを調べるには、ブレークポイントを設定するなどの工夫が必要。 えらいレベルの低い内容だな
そういうレベルの事を聞いてる?
そもそもテンプレート以外はソースがなかったりするぞ 他の環境も使えるなら
まずは他の環境で試してみて
ライブラリ自体のバグか使う側の問題か
を切り分けするんだろうね
使い方の問題であれば
問題が発生する使い方と問題が発生しない使い方を色々と調べて差を縮めていって絞るとか
具体例が無いとアドバイスはなかなか難しい
環境とか何系ライブラリとかも定まらない? >>350
今までコマンドでやっていたのでIDEもいいかもしれません
>>352
環境はlinux(WSLも含む)です
使うライブラリは公開されているものからされていないものまでありますが科学系の計算ライブラリが多いです
使用者が少なかったりかなり古いものだったりもするので情報を手に入れるのが難しく、自分でなんとかするしかない次第です
使い方が分からないというよりは実行ファイルを作るのが難しいというレベルです
最近困ったのだと、詳しくは分かりませんがおそらくリンク系のエラーでした
現時点では使える複数の環境はありませんが、安いPCを購入することは可能です
よろしくお願いします インストール方法が分からないって感じかな
readmeとかドキュメントのインストール方法や依存関係の記述をきちんと読むとかそんなところじゃない? 線形代数とか統計とか?
環境構築面倒だよね
複数のライブラリで同じライブラリを使ってるけど指定バージョンが違うとか
まあ頑張ってとしか >>354
探してみます
どれも「このライブラリを使うにはこのライブラリとこのライブラリが必要だよ」くらいしか書いてくれていなかった気がしますが
>>355
そういうのを組み込んだライブラリなどです
使用するだけでそこまで詳しくないので最初の構築が一番苦労しますね
どう頑張ればいいのかも分からないので本当に困ってしまいます 公開日時もヒントだよ。その日付よりも後に出たバージョンを使ってないってのが分かる
ビルドオプションがキーになることもあるからmakefileチェックするとか、
ソースからビルドしようとせずにバイナリ使って逃げるとか、
ひどいのになるとdebugビルドは無理でreleaseビルドするしかないなんてのもある
なんにせよエラー表示見ながら試行錯誤するしかない これから時間を掛けて プログラミング言語 つくるつもりです
一体どんな機能を加えようかと。
何かこれがほしい、あれは入れるな、とかあれば 意見ください >>358
既存言語のいいとこ取り
なおダブスタも存在するもよう Illegal instructionってエラーが出るんだけどどういう時に起こりますか? メモリを破壊してIllegalなinstructionが実行されたとき はやっ!ありがとうございます
メモリ系ですか
パソコンによってこのエラーが出なかったりするのは何故でしょう? 新しいCPUの命令セットを使ったプログラムを古くて部分的にサポートされてないCPUで実行しようとしたときに起こる 確かに古い方のパソコンでエラーが出ます!
あとおもしろい発見をしました
(this=this@entry=0x7ffffffec7a0)と該当エラーの行(例えば100行目)に出ているのですが
その100行目にdouble a = 2;と、エラーの起こさないであろう命令を入れてみました
しかし先ほどと同じ100行目のこの命令にIllegal instructionのエラーが出ます
どうやら100行目に命令があるということが問題のようです
どういうことでしょうか?? >>366です
>>367
すみません勘違いしていました>>366は無視してください
どうやらただの足し算でIllegal instructionが出ているようです 普通にコンパイルするとダイナミックリンクになるプログラムをスタティックリンクにするにはどうすればいいですか? 普通にせずにスタティックライブラリとしてビルドすればいいw
IDEでの設定なり、コマンドラインオプションで指定できるでしょ あ!そういうオプションがありました
ありがとうございます 共通暗号方式の DES を高速化する方法はありませんか? >>374
ハードウェアでDES処理しているもの、を探しているのですが…
もう売ってないですよね… DESではどうやっても体感できるほどの差にはならんだろ
よほどデカイか環境がプアじゃない限りは 大規模なC++のコードに対して、あるライブラリを追加したい。
そのライブラリのnew_tool(仮名).aファイルを
Makefile内のインクルードに追加すれば使える
らしいんだけど、具体的にどうMakeを書けばよいか教えてください。 「c++ include makefile」で検索! opencvの32ビット版を使いたいのですが、最新版のインストーラに付いて来たソースコードをCMAKEしたら、X64のソリューションしか作成されませんでした
どうしたらwin32(x86)のソリューションが作成されるでしょうか? サンプルをビルドできない→サンプルなんて参考にするだけでいいじゃん
本体をビルドできない→32bitバイナリダウンロードしたら?
答えになってないけどw How to create the OpenCV binary files yourself - Part 1
https://www.youtube.com/watch?v=NnovZ1cTlMs
How to create the OpenCV binary files yourself - Part 2
https://www.youtube.com/watch?v=qGNWMcfWwPU >>380
VSでそのソリューションに対し、x64用の構成を鋳型にして新しい構成を作成し、アーキテクチャをx86に変えてみたらどうなる。 cmakeでvsのslnを生成するのは一般的だからな
ただしopencvに一般論が当てはまるのかは知らない dso(dynamic shared object)は、Linux の *.so のことだと思っていいの?
つまり、shared library と言われている物と dso は同じ? >>358
プログラミング言語は、現時点で多すぎ、もうお腹いっぱいです…
むしろ、いろんな言語でわりと共通に使えるクラスライブラリを書いてください
互換性とかはあまりとやかくいわないつもりです、要は機能と名前がセットで共通なのがいいです >>359
バルス!も宮崎駿のロマン、なんですか? for (size_t i=0; i < for.getLength(); ++i){/*処理*/}
こういうコード多いですよね
コンパイラは終了条件のget関数のとこ副作用は無いものとして最適化するんですか? 処理の中でlengthに変化ないとコンパイラが確信できたら最適化。グレーだったら最適化されない
コンパイラにもよるんだろうけど ジャルジャル、「レギュラーゼロ」でも年間2億円超!?荒稼ぎの“内訳”とは
お笑いコンビ「ジャルジャル」(後藤淳平、福徳秀介)の年収は2億円と、
1月22日放送の「せやねん!」(毎日放送)が試算した。
YouTubeに関しては、8000本という持ちネタを約4年前から毎日投稿し、計算上は
2039 年まで投稿可能。ネタは1日で数十本まとめ撮りしていると紹介され、
あるYouTuberの証言 として、年間4000万〜5000万円の収入があるとした。
また、19年に開始したオンラインサロンは月額1100円。会員数は未公表だが、
キングコング西野の会員が5.8万人を参考に、ジャルジャルは1万人と仮定すると、
これだけでも年間1億円超。加えてライブはチケット代が6000円ぐらいで、昨年は
ツアーを2回開催。一つは16公演(劇場+配信)で1万人を動員し、売上推定は
約4000万円。もう一つは12公演で、動員数は未公表だが、単純に1回目の75%で
計算すると売上推定は約3000万円。合計7000万円が昨年のライブにおける売上と試算。
以上の3つを合計し、ジャルジャルは年間、2億円超を稼いでいると結論づけていた。 以下の2つのパターンでプロジェクトにマニフェストファイルを取り込んだ場合、違いはあるのでしょうか。
また、どちらがポピュラーなのでしょうか。
==============================
前提:App.manifestはexeと同階層に配置。
------------------------------------------------------------
@:プロジェクトを右クリック→「追加」→「既存の項目」
で、すでに作成済みのApp.manifestを追加。
A:プロジェクトを右クリック→「プロパティ」→「マニフェスト ツール」→
追加のマニフェスト
で、すでに作成済みのApp.manifestのパスを記載。
試してみたところ、@Aともにビルド時に正しくマニフェストファイルが読み込まれ、一見動作的な違いは現れませんでした。
ただ、@はプロジェクトのソース一覧にマニフェストが表示されるのに対し、
Aは表示されていません。
ご教示お願い致します。 マニフェストを埋め込まなかった場合は、ユーザーはマニフェストを変更または削除できるでしょう。
それをどう考えるかだね。 >>394
レスありがとうございます。
挙げたパターンで言うと、@が埋め込んだ場合でAが埋め込まない場合、という解釈でよいのでしょうか?
(言葉の綾かもしれませんが、初学者の私にはどちらも"埋め込んでいる"ように思えます…)
プログラムとしての是非はともかく、VisualStudioなどでプロジェクトを開いたときにマニフェストファイルが表示される@のほうが
わかりやすくて好みですね。 ああ、どちらも埋め込んでますね(リソースエディタで確認)。
違いはないようです。 >>396
(返信が遅れてしまい申し訳ありません)
色々と教えて頂きありがとうございました。