<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>C++ &#8211; フリーランスさばいばる</title>
	<atom:link href="https://dev-memo.net/category/programming/cpura/feed/" rel="self" type="application/rss+xml" />
	<link>https://dev-memo.net</link>
	<description>生涯フリーランスで生き延びるためのブログ</description>
	<lastBuildDate>Thu, 03 Nov 2022 23:25:19 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.2</generator>

<image>
	<url>https://dev-memo.net/wp-content/uploads/2022/06/cropped-favicon-32x32.png</url>
	<title>C++ &#8211; フリーランスさばいばる</title>
	<link>https://dev-memo.net</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>【C++】浮動小数点数の誤差（double→floatで値が変わる）</title>
		<link>https://dev-memo.net/floating_point_number/</link>
					<comments>https://dev-memo.net/floating_point_number/#respond</comments>
		
		<dc:creator><![CDATA[キミヒラ]]></dc:creator>
		<pubDate>Wed, 14 Mar 2018 17:37:53 +0000</pubDate>
				<category><![CDATA[C++]]></category>
		<guid isPermaLink="false">https://dev-memo.net/?p=733</guid>

					<description><![CDATA[<p><img src="https://dev-memo.net/wp-content/uploads/2017/11/mistake-1966460_1920-1024x651.jpg" class="webfeedsFeaturedVisual" /></p>C++で下記の２つのメソッドに3.6fを引数に渡すと異なる結果になります。 test1は35を返し、test2は36を返します。3.6 / 0.1なので、36が欲しい結果なので35を返すtest1の実装だとNGなわけです [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><img src="https://dev-memo.net/wp-content/uploads/2017/11/mistake-1966460_1920-1024x651.jpg" class="webfeedsFeaturedVisual" /></p>
<p><strong>C++</strong>で下記の２つのメソッドに<strong>3.6f</strong>を引数に渡すと異なる結果になります。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-cpp" data-lang="C++"><code>const float UNIT = 0.1f;
int test1(float num)
{
    return (int)  (num / UNIT);
}

int test2(float num)
{
    float result = num / UNIT;
    return (int) (result);
}</code></pre></div>



<p><strong>test1</strong>は<strong>35</strong>を返し、<strong>test2</strong>は<strong>36</strong>を返します。<br><span class="rmarker"><span class="swl-marker mark_orange"><em><strong>3.6 / 0.1</strong></em>なので、<strong>36</strong>が欲しい結果なので35を返すtest1の実装だとNGなわけです。</span></span></p>



<p>二つのメソッドの違いは、一度計算結果をfloatの変数に入れているかどうか。</p>



<p>なぜこのような計算結果の違いがおこるのか、自分だけでは理解できずに<strong>teratail</strong>で質問してみました。</p>



<figure class="wp-block-embed"><div class="wp-block-embed__wrapper">
https://teratail.com/questions/116812
</div></figure>



<p>質問してすぐに３人の方から回答頂き、理解することができました。</p>



<p><span class="ymarker"><span class="swl-marker mark_yellow">結論からお話すると、<strong>「浮動小数点数の誤差」</strong>と<strong>「キャスト時の丸め処理の違い」</strong>が原因でした。</span></span></p>



<p>では詳しく解説していきます。</p>



<p class="is-style-icon_announce">※浮動小数点の誤差は、開発環境（コンパイラやOSなど）によって異なります。<br>上記のサンプルの計算結果にならない環境の方が多いみたいです</p>



<h2 class="wp-block-heading">原因その１：浮動小数点数の誤差が発生していた</h2>



<p><span class="ymarker"><span class="swl-marker mark_yellow"><strong>浮動小数点数の誤差</strong>が発生している事がわかりました。</span></span></p>



<p>計算結果を<strong>double</strong>で受けてみると、下記の値になっていました。</p>



<p class="is-style-dent_box">35.99999849999995</p>



<p>計算に使っている少数が２進数だと表現できない<strong>循環小数</strong>だったのでこのような誤差が出ているんですね。</p>



<p>ただこれだけだと、test1とtest2の計算結果が異なる理由にはなりませんね。<br>test1とtest2で同じように<strong>浮動小数点数の誤差</strong>が発生しているわけですから。</p>



<h2 class="wp-block-heading">原因その２：floatに代入する事で四捨五入されていた</h2>



<p><strong>teratail</strong>ではこのように回答を頂きました。</p>



<blockquote class="wp-block-quote"><p>test1はdoubleを直接intへ変換してます。test2はdoubleを一旦floatへ変換後intへ変換してます。</p></blockquote>



<p>これは、実際にキャスト処理イメージしてみるとわかりやすいです。</p>



<h3 class="wp-block-heading">test1の場合</h3>



<p><strong>double</strong>の<strong>35.99999849999995</strong>を直接<strong>int</strong>へ変換します。<br><span class="ymarker"><span class="swl-marker mark_yellow"><strong>double</strong>から<strong>int</strong>への変換では、<strong>「<span style="color: #ff0000;"><span class="swl-inline-color has-black-color">小数点以下は切り捨て</span></span>」</strong>になります。</span></span></p>



<p><span class="ymarker">なので、<span class="swl-marker mark_yellow">限りなく36に近い35.9999&#8230;でも35になってしまう<span style="color: #ff0000;"><span style="color: #000000;">の</span></span>ですね。</span></span></p>



<h3 class="wp-block-heading">test2の場合</h3>



<p>こちらのケースは、まず<strong>double</strong>の<strong>35.99999849999995</strong>を<strong>float</strong>へ変換します。</p>



<p><span class="ymarker">この時に、<strong>float</strong>の方が<strong>double</strong>より有効桁数が小さいので、<span class="swl-marker mark_yellow"><span style="color: #ff0000;"><span class="swl-inline-color has-black-color">floatの有効桁数に収まるように「</span></span><strong><span style="color: #ff0000;"><span class="swl-inline-color has-black-color">四捨五入</span></span>」</strong>されます。</span></span><br>floatの有効桁数は6桁です。</p>



<p><span class="ymarker">有効桁数に収まるように四捨五入すると、36.0になるわけですね。</span></p>



<p>36.0のfloatをintに変換する時はそのまま36のままです。<br>小数点以下を切り捨てても変わらないので。</p>



<h3 class="wp-block-heading">ようするに…</h3>



<p><span class="swl-marker mark_yellow">test1とtest2の結果の違いは、キャストの方法が違いから丸めの処理が異なっているのが原因だったというわけです、</span></p>



<ul><li>test1(double→int)は、小数点以下を切り捨て</li><li>test2(double→float)は、有効桁数６桁で四捨五入</li></ul>



<h2 class="wp-block-heading">対応策</h2>



<p><span class="swl-marker mark_orange">理屈がわかったところで<span class="rmarker">、<strong>「test1もtest2も正確な計算結果を返す保証がない」</strong>ことがわかりました。</span></span></p>



<p>test1は、既に前述の通り誤った値を返しています。<br>test2は前述のケースでは正しい値を返していますが、たまたま四捨五入の結果正しい値になっただけです。<br>test1と同様に誤った値を返すケースもあるでしょう。</p>



<p>対応策を調べてみると、下記のような方法があるようです。</p>



<ul class="is-style-good_list"><li>BigDecimalを使う</li><li>整数で処理する</li><li>有効桁を決めて四捨五入する</li></ul>



<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8165411688183013"
     crossorigin="anonymous"></script>
<ins class="adsbygoogle"
     style="display:block; text-align:center;"
     data-ad-layout="in-article"
     data-ad-format="fluid"
     data-ad-client="ca-pub-8165411688183013"
     data-ad-slot="6898168693"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script>



<h2 class="wp-block-heading">おわりに</h2>



<p>計算系の処理を実装する時は気をつけないといけませんね。<br><span class="swl-marker mark_orange">特に小数点を扱うような処理の時は要注意です。</span></p>



<p>それにしても、teratailにはすごく助けられました。</p>



<p>投稿してから最初の回答をもらうまで５分と、早すぎてびっくりしました。</p>



<p>一人で考えていると煮詰まっている時は、誰かの意見を聞くとパッと視界がクリアになって理解できることも多いです。</p>



<p><span class="ymarker">自宅で一人で仕事していて、相談相手がいない僕のような人でも気軽に質問できるteratailは救世主的存在ですね</span>。</p>



<p>プログラミングで困ったことがあれば、是非使って見る事をオススメします。</p>



<p>この記事が少しでも参考になれば幸いです。</p>



<p>最後までお読み頂きありがとうございました。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://dev-memo.net/floating_point_number/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【C++】なにも代入していないクラス変数に値が入っている理由</title>
		<link>https://dev-memo.net/default_constructor/</link>
					<comments>https://dev-memo.net/default_constructor/#respond</comments>
		
		<dc:creator><![CDATA[キミヒラ]]></dc:creator>
		<pubDate>Tue, 06 Sep 2016 17:27:24 +0000</pubDate>
				<category><![CDATA[C++]]></category>
		<guid isPermaLink="false">http://dev-memo.net/?p=107</guid>

					<description><![CDATA[<p><img src="https://dev-memo.net/wp-content/uploads/2019/05/desk-3139127_1280-1024x659.jpg" class="webfeedsFeaturedVisual" /></p>Javaプログラマーだった僕が不思議に思った、C++変数の初期化について解説します。 変数を初期化しないのに動く？ C++のプログラムを修正していると、何も値を代入していない変数を平然と使っているソースコードを見かけます [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><img src="https://dev-memo.net/wp-content/uploads/2019/05/desk-3139127_1280-1024x659.jpg" class="webfeedsFeaturedVisual" /></p>
<p>Javaプログラマーだった僕が不思議に思った、C++変数の初期化について解説します。</p>



<h2 class="wp-block-heading">変数を初期化しないのに動く？</h2>



<p>C++のプログラムを修正していると、何も値を代入していない変数を平然と使っているソースコードを見かけます。</p>



<p>こんな感じです。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-cpp" data-lang="C++"><code>int _tmain(int argc, _TCHAR* argv[])
{
	Foge foge;

	std::cout &lt;&lt; foge.int_a;
}</code></pre></div>



<p>この変数<strong>foge</strong>には、値が何も代入されていません。</p>



<p>インスタンスのない変数のメンバである<strong>int_a</strong>を参照しています。</p>



<p><span class="swl-marker mark_orange"><span class="rmarker">Javaだったらこれはコンパイルエラーになります</span>が、C++でコンパイルも通りますし普通に動いちゃうんです。</span></p>



<p>不思議ですよね。<br>変数<strong>foge</strong>には何が入っているのでしょうか…？</p>



<h2 class="wp-block-heading">暗黙的に呼び出されるデフォルトコンストラクタ</h2>



<p><strong><span class="ymarker">実は、C++では値の代入を省略すると、デフォルトコンストラクタが暗黙的に呼び出されるのです。</span></strong></p>



<div class="swell-block-capbox cap_box is-style-onborder_ttl" data-colset="col3"><div class="cap_box_ttl"><span>デフォルトコンストラクタの性質</span></div><div class="cap_box_content">
<ul>
<li>引数の指定がないコンストラクタ</li>



<li>コンストラクタが１つも定義されていなければ自動生成される</li>
</ul>
</div></div>



<p>暗黙的に、引数なしのコンストラクタが呼ばれるという事なので、下記の２つのソースコードはイコールになります。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-cpp" data-lang="C++"><code>Foge foge;

Foge foge = Foge();</code></pre></div>



<p><span class="swl-marker mark_yellow">変数の中身はかっらぽかと思っていましたが、暗黙的にインスタンスが代入されていたのでコンパイルエラーにもならずに、正常に動作していたんですね。</span></p>



<h2 class="wp-block-heading">暗黙的代入を利用する際の注意点</h2>



<p>暗黙的代入を利用する場合、いくつか注意点があります。</p>



<p>下記のようなケースはエラーになってしまうので注意です。</p>



<h3 class="wp-block-heading">基本型は暗黙的代入の対象外</h3>



<p>下記のコードはエラーになります。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-cpp" data-lang="C++"><code>	int a;
	std::cout &lt;&lt; a;</code></pre></div>



<p><span class="rmarker"><span class="swl-marker mark_orange">基本型は暗黙的に初期化されません。</span></span></p>



<h3 class="wp-block-heading">引数なしコンストラクタがないクラスは暗黙的代入の対象外</h3>



<p>こちらのケースもエラーになります。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-cpp" data-lang="C++"><code>class Foge {
	
public:
	int int_a;
	Foge(int param){
		int_a = param;
	}
};

int _tmain(int argc, _TCHAR* argv[])
{
	Foge foge;
	std::cout &lt;&lt; foge.int_a;

	return 0;
}</code></pre></div>



<p><span class="swl-marker mark_orange">このクラスはデフォルトコンストラクタがありません。</span></p>



<p class="is-style-big_icon_caution">コンストラクタが１つも実装されていなければ、デフォルトコンストラクタが自動生成されるのですが、１つでも実装されていれば生成されません。</p>



<p>この<em><strong>Foge</strong></em>クラスは、<em><strong>Foge(int param)</strong></em>の引数ありコンストラクタしか存在しないのです。</p>



<p><span class="rmarker">デフォルトコンストラクタが存在しないので、デフォルトコンストラクタを呼び出す暗黙的代入が機能しないということです。</span></p>



<p>下記のソースコードは正常に動きます。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-cpp" data-lang="C++"><code>class Foge {
	
public:
	int int_a;
};

int _tmain(int argc, _TCHAR* argv[])
{
	Foge foge;
	foge.int_a = 1;
	std::cout &lt;&lt; foge.int_a;

	return 0;
}</code></pre></div>



<p>このコードでは、Fogeクラスにコンストラクタが何も実装されていませんので自動的にデフォルトコンストラクタ生成されます。</p>



<p>デフォルトコンストラクタがあれば、暗黙的代入が作動するので問題なく動くという事です。</p>



<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8165411688183013"
     crossorigin="anonymous"></script>
<ins class="adsbygoogle"
     style="display:block; text-align:center;"
     data-ad-layout="in-article"
     data-ad-format="fluid"
     data-ad-client="ca-pub-8165411688183013"
     data-ad-slot="6898168693"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script>



<h2 class="wp-block-heading">まとめ</h2>



<p>C++で何も値を代入していない変数は、一見カラのように見えますが、暗黙的にデフォルトコンストラクタで生成されたオブジェクトが代入されています。</p>



<p>ただし、暗黙的に値が代入されるには条件があり、一概にC++で初期化不要と言えるわけではありません。</p>



<p><span class="ymarker"><span class="swl-marker mark_yellow">ソースコードの可読性や、後から引数ありコンストラクタを定義したら動作しなくなるリスクを考えると、暗黙的代入に頼らず変数は初期化する癖をつけておいたほうが良さそうですね。</span></span></p>



<p>この記事が少しでも参考になれば幸いです。</p>



<p>最後までお読みいただきありがとうございました。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://dev-memo.net/default_constructor/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>C++のメモリ管理【ヒープ領域とスタック領域】</title>
		<link>https://dev-memo.net/c_memory/</link>
					<comments>https://dev-memo.net/c_memory/#respond</comments>
		
		<dc:creator><![CDATA[キミヒラ]]></dc:creator>
		<pubDate>Thu, 25 Aug 2016 07:40:04 +0000</pubDate>
				<category><![CDATA[C++]]></category>
		<guid isPermaLink="false">http://dev-memo.net/?p=98</guid>

					<description><![CDATA[<p><img src="https://dev-memo.net/wp-content/uploads/2016/06/hashrateIMGL6542_TP_V-1024x682.jpg" class="webfeedsFeaturedVisual" /></p>普段JavaやPHPを使ってメモリ管理を意識することがないのですが、C++ではそうはいきませんね。 メモリ管理が原因で不具合を生んだり、メモリリークを起こしてしまうかもしれません。 他言語のプログラマーがC++での開発を [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><img src="https://dev-memo.net/wp-content/uploads/2016/06/hashrateIMGL6542_TP_V-1024x682.jpg" class="webfeedsFeaturedVisual" /></p>
<p>普段JavaやPHPを使ってメモリ管理を意識することがないのですが、C++ではそうはいきませんね。</p>



<p>メモリ管理が原因で不具合を生んだり、メモリリークを起こしてしまうかもしれません。</p>



<p>他言語のプログラマーがC++での開発を行う時に意識すべきメモリ管理について解説します。</p>



<h2 class="wp-block-heading">メモリの割当て領域で扱いが変わる</h2>



<p>C++ではデータは宣言の仕方によって２種類のメモリ領域に割り当てられます。</p>



<p><span class="swl-marker mark_yellow">それが、<strong>スタック領域</strong>と<strong>ヒープ領域</strong>です。</span></p>



<p>Javaにもこの領域はありますが、GCが管理してくれているのであまり意識することはないですよね。</p>



<h3 class="wp-block-heading">スタック領域</h3>



<p><strong><span class="swl-marker mark_yellow"><span class="ymarker"><span style="color: #ff0000;"><span class="swl-inline-color has-black-color">new以外</span></span></span></span></strong><span class="ymarker"><span class="swl-marker mark_yellow">で宣言したデータがスタック領域に格納されます。</span></span><br>スタック領域に格納されたデータは、<span class="ymarker"><span class="swl-marker mark_yellow">その変数がスコープを抜けると自動的にメモリが開放されます。</span></span></p>



<h3 class="wp-block-heading">ヒープ領域</h3>



<p><strong><span class="swl-marker mark_yellow"><span class="ymarker"><span style="color: #ff0000;"><span class="swl-inline-color has-black-color">new</span></span></span></span></strong><span class="ymarker"><span class="swl-marker mark_yellow">で宣言されたデータがヒープ領域に格納されます。</span></span><br>ヒープ領域に格納されたデータは<strong><span class="rmarker"><span class="swl-marker mark_orange">自動でメモリが開放されません。</span></span></strong><br><span class="rmarker">スコープがはずれてもメモリに残り続けるので、プログラマが明示的にdelete演算子で開放してあげる必要があります。</span></p>



<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8165411688183013"
     crossorigin="anonymous"></script>
<ins class="adsbygoogle"
     style="display:block; text-align:center;"
     data-ad-layout="in-article"
     data-ad-format="fluid"
     data-ad-client="ca-pub-8165411688183013"
     data-ad-slot="6898168693"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script>



<h2 class="wp-block-heading">実装時の注意</h2>



<p>上記を踏まえて、実装の時に何を意識したら良いのか。</p>



<h3 class="wp-block-heading">newで生成したデータは初期化すること</h3>



<p><span class="rmarker"><span class="swl-marker mark_yellow">newで生成したデータは、メモリに残り続けるのでちゃんと初期化してあげましょう。</span></span><br>メモリリークの原因になります。</p>



<p>メモリの開放は<strong>delete関数</strong>で。</p>



<p>逆に、newで宣言していないデータは、使わなくなったら勝手にメモリから開放されるので何も気にしなくて問題ありません。</p>



<p><span class="ymarker">特に理由がない限りは、newは使わないよう</span>すると良いかもしれません。</p>


<div class="swell-block-balloon"><div class="c-balloon -bln-left" data-col="yellow"><div class="c-balloon__icon -square"><img decoding="async" src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="https://dev-memo.net/wp-content/uploads/2022/08/icon_cut-2-150x150.jpg" alt="" class="lazyload c-balloon__iconImg" width="80px" height="80px"><noscript><img decoding="async" src="https://dev-memo.net/wp-content/uploads/2022/08/icon_cut-2-150x150.jpg" alt="" class="c-balloon__iconImg" width="80px" height="80px"></noscript><span class="c-balloon__iconName">キミヒラ</span></div><div class="c-balloon__body -speaking -border-on"><div class="c-balloon__text">
<p>僕はJavaに慣れているので積極的にnewを使っていましたが良くなかったですね。</p>
<span class="c-balloon__shapes"><span class="c-balloon__before"></span><span class="c-balloon__after"></span></span></div></div></div></div>


<h3 class="wp-block-heading">ポインタ変数を関数の戻り値にしない</h3>



<p>関数内で生成したスタック領域のデータは、スコープを出た時にメモリから開放されます。</p>



<p>という事は、<span class="rmarker"><span class="swl-marker mark_orange">関数内で生成したデータのポインタを戻り値で返しても、上位ルーチンでは参照出来ません。</span></span><br>正確には「<span class="rmarker">ポインタの参照先にどんなデータが格納されているかわからない</span>」という事になります。</p>



<p>もちろん、intなどの値型の変数は戻り値にしても大丈夫ですが。</p>



<p>対策方法は下記の記事が参考になるので、貼っておきます。</p>



<figure class="wp-block-embed"><div class="wp-block-embed__wrapper">
https://ota42y.com/blog/2014/09/16/stack-heap/
</div></figure>



<h2 class="wp-block-heading">まとめ：スタック領域とヒープ領域の違いを意識する</h2>



<p>JavaやPHPのエンジニアだったら殆ど意識することないですよね。<br>ただ理解してしまえば難しい事はありません。</p>



<p>少しでも参考になれば幸いです。</p>



<p>最後までお読みいただきありがとうございました。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://dev-memo.net/c_memory/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
