ベストアンサー ※ ChatGPTを利用し、要約された質問です(原文:VB6のFIX関数での誤差について) VB6のFIX関数での誤差について 2008/06/12 09:36 このQ&Aのポイント VB6のFIX関数を使用すると、DOUBLE型の数値または数式を入れる構文となっていますが、明示的な変換を行っていない場合に誤差が発生することがあります。マイクロソフトのサポートはVB6について終了しているため、問題解決には困難があるかもしれません。同じFIX関数をVS2005で試した場合には正確な値が表示されることがあります。 VB6のFIX関数での誤差について VB6のFIX関数を使用すると次の事象が発生しました。 私自身で制限事項等を調べてみたのですが、探す事が できませんでした。FIX関数へは、DOUBLE型の数値また は数式を入れる構文となっていますが、今回はDOUBLE型 への明示的な変換は行っていませんでした。しかし、VB6 はデータ型をあまり意識しなくても良い仕様の言語である ので内部的にDOUBLE型へ変換しているのであれば誤差が あるのは矛盾していると思います。 マイクロソフトのサポートもVB6については終了している ので個人的に聞いてもだめでした。 また、VS2005で同じFIX関数を試してみると正確な値が戻 ってきました。 以上、よろしくお願いします。 FIX(7520*0.15) を実行すると「1127」が表示されます。 実際は、「1128」なのですが1円の誤差が発生します。 FIX(DOUBLE(7520*0.15))を実行すると「1128」が表示され ます。 ※ 実行環境 OS:Windows XP SP2、 Visual Basic Ver 6 Professional SP5 質問の原文を閉じる 質問の原文を表示する みんなの回答 (2) 専門家の回答 質問者が選んだベストアンサー ベストアンサー Hayashi_Trek ベストアンサー率44% (366/818) 2008/06/12 18:13 回答No.2 0.15 のデータ型はなんですか? 下記プログラムでは正しい値が出ますよ。 Dim a As Currency Dim b As Currency Dim c As Currency Dim d As Double a = 7520 b = 0.15 d = 0.15 c = Fix(a * b) MsgBox CStr(c) c = Fix(a * d) MsgBox CStr(c) 質問者 お礼 2008/06/12 18:23 0.15がdoubleとなっていました。 参考にさせていただきます。 広告を見て全文表示する ログインすると、全ての回答が全文表示されます。 通報する ありがとう 0 その他の回答 (1) Hayashi_Trek ベストアンサー率44% (366/818) 2008/06/12 13:49 回答No.1 コンピュータの中では数値を2進数で扱うので、整数には大きさの制限があり、実数にはそれに加えて小数で表現する桁数の限界があります。 これはコンピュータで数値計算をする場合に注意しなければならない事柄です。 この場合も、7502*0.15の結果が例えば1127.999999998とかになっているのです。 人間ならば答えは1128だなと「察する」ことが出来ますが、コンピュータは律儀に1127を返します。 回避策としては、 ・小数点4桁目あたりで四捨五入してからFIX()する。 ・計算に使用する数値をdouboe型ではなく通貨型にする。 のいずれかでどうでしょう? 質問者 補足 2008/06/12 17:38 ありがとうございました。 回避策の2番目ですが、 Dim a As Currency a = 7520 Fix(a * 0.15) としても「1127」とやはり表示されます。 また、同じパソコン・OSなのにVB6ではだめで VS2005ならOKなのかが理解できません。 広告を見て全文表示する ログインすると、全ての回答が全文表示されます。 通報する ありがとう 0 カテゴリ パソコン・スマートフォンソフトウェアその他(ソフトウェア) 関連するQ&A VB6のFIX関数での誤差について VB6のFIX関数を使用すると次の事象が発生しました。 私自身で制限事項等を調べてみたのですが、探す事が できませんでした。FIX関数へは、DOUBLE型の数値また は数式を入れる構文となっていますが、今回はDOUBLE型 への明示的な変換は行っていませんでした。しかし、VB6 はデータ型をあまり意識しなくても良い仕様の言語である ので内部的にDOUBLE型へ変換しているのであれば誤差が あるのは矛盾していると思います。 マイクロソフトのサポートもVB6については終了している ので個人的に聞いてもだめでした。 また、VS2005で同じFIX関数を試してみると正確な値が戻 ってきました。 以上、よろしくお願いします。 FIX(7520*0.15) を実行すると「1127」が表示されます。 実際は、「1128」なのですが1円の誤差が発生します。 FIX(DOUBLE(7520*0.15))を実行すると「1128」が表示され ます。 ※ 実行環境 OS:Windows XP SP2、 Visual Basic Ver 6 Professional SP5 VB 6 を VS 2012に変換するには? 長いこと、VB6で開発をしてきました。このプログラムはハードはRS-232Cを使い入力したデーターをグラフや表で表示したりするものです。VB6を何も不足もなく使って来ましたが、時代に取り残されないように、VisualStudio2012 Professional with MSDN(以下VS2012と略す)を購入しました。ところがプロジェクトファイルの拡張子が違うので読み込めないのです。拡張子が違うことは内容も違うことが考えられます。VB6 ->VS2012 変換をする方法をご教授ください。VS2010に変換する方法で結構ですので皆様、教えて下さい。 ツールボックスからボタンや何やら、最初から同じ名前で作り、ベーシックのソースだけコピーすれば出来るのではと、一度は試しましたが、例として UnLoad xxx 等の重要な関数が付いていないようでコンパイルできないのです。 この方法で、解決された方がおりましたら、回答、お願いいたします。 clock()関数の誤差 プログラムの実行時間の計測について質問させていただきます。 現在,実行時間の計測でclock()関数を使っているのですが誤差が出ます。 timeコマンド(と実際に時計で測った時間)では95分、clock()関数で測った プログラム全体の実行時間は1376秒(約23分)と誤差が出る状態にあります。 プログラムでclock()関数を使っているのはmain()だけです。 printf()内がおかしいのでしょうか? 詳しい方、回答よろしくおねがいします。 ↓プログラム #include<time.h> (中略) clock_t t1,t2,t3,t4; (中略) main() { struct zahyo P,Q; int a,b,prime,Ord,sec; scanf("%d",&a); (中略) printf("Q.y = "); scanf("%d",&Q.y); t1=clock(); Ord=OrdCal(P,a,prime); t2=clock(); printf("Ord = %d\n",Ord); printf("OrdCal:%f(s)\n",(double)(t2-t1)/CLOCKS_PER_SEC); t3=clock(); PohlingBsgs(P,Q,a,prime,Ord); sec=secretkey(); t4=clock(); printf("secretkey=%d\n",sec); printf("Decipher:%f(s)\n",(double)(t4-t3)/CLOCKS_PER_SEC); printf("Total :%f(s)\n",(double)(t4-t1)/CLOCKS_PER_SEC); } 実行結果 Ordcal:74.170000(s) Decipher:1302.722704(s) Total :1376.902104(s) real 94m33.445s user 94m30.900s sys 0m0.980s 携帯料金を賢く見直す!格安SIMと端末選びのポイントは? OKWAVE コラム VC++6.0からVBで作成したActiveX.DLL内の関数が呼出しできない VB6.0で作成したActiveX.DLLをVC++6.0(Win32SDK)側で 呼び出すプログラムを作成中です。 VB側(DLL)では問題なく作成できています。 Classに1つPublic関数を作成しただけです。 (Instancingは5MultiUseにしてあります) しかし、VC++側の呼出しでDLL内の関数が 呼び出せないのです。 LoadLibraryExでDLL自体のハンドルは取得できるのですが GetProcAddressで関数の取得時にNULLが返ってきてしまいます。 今まで試したことは ・VBからの呼出しはOK ・MFCだとOK ・SDKでもuser32.dll呼出しのサンプルは関数も実行できる です。 今からMFCへ以降するのは厳しいのでSDkでの方法を 知りたいです。 VB側が悪いのかもしれませんが、関数1つですし、 いじるところもほとんどないので多分VC++側だと 思っています。 なにか注意点とか確認するところをおしえていただければ 幸いです。 環境 Windows2000 SP3 VB6.0 SP5 VC++6.0 SP5 Win32SDK VB6のDateDiff関数が、お客さんのPCでは実行時エラー5になり VB6のDateDiff関数が、お客さんのPCでは実行時エラー5になります。 お客さんのPCは、買ったばかりの新品で Windows7(Pro)です。 僕のPCは、XPから、7にアップグレード(Home)したのもです。 VB6SP6 を当てています。 僕のPCでは、VB6の最近のKBは、当てていません。(お客さんのは不明) エラーは、「プロシジャの呼び出し 引数が不正です」で、 試しに、お客さんのPCにVb6とVB6SP6を入れて(あとで削除します ^^; イミディエットウインドウで、 ?DateDiff("d",cDate("2010/12/08"),Date) としても発生します。 マイクロソフトのサイトでKBがでてるか探しましたが、見つかりませんでした。 vb2008 MIDB関数 VB2008を勉強しながら、プログラム開発を行っています。 VB6の時にはMIDB関数が存在したのですが、VB2008では、MIDB関数が無くなっていました。 プログラム作成にあたり、文字列のバイト操作が必要になり、Leftb、RitghB、MIDBを 作成しているのですが、全く分からない状態です。 SHIFT-JISコードに変換してバイト配列よりすればいいと他のサイトに載っていたので それを参考にしていたのですが、全角文字が存在した時に、文字化けをおこしてしまい 正常な文字で表示されないようになってしまいました。 全角文字の半分の1バイトの場所での指定だったので文字化けを起こしている事は 分かったのですが、これを空白にする事は可能なのでしょうか? また、バイト操作を行うサンプル等がありましたら、教えて頂けないでしょうか? 以上 Shell関数実行直後の問題 Eexcl2003 VBにて、Shell関数を実行しました。 Shell関数によるトラブルは無いのですが、 Shell関数実行指示後の構文で、 Left/Mid/Right/Date/Timeの構文部が実行時エラーになります。 対象Eexclファイルを閉じ、再度開き、Shell関数部分を削除して、 マクロを実行すると、上記関数は正常に作動します。 解決策が想い浮かばないので、先達たちに教えを乞います。 宜しくお願いします。 VB6 Dir関数で52エラー発生 いつもお世話になっています。 最近になって、VB6のDir関数を実行するとき、実行時エラー52が発生します。 既存のプログラムに、メール送信機能を追加しました。 このとき、BASP21をインストールしました。 これ以外のプログラムのインストールはWindowsUpdate以外はかかっていません。 皆さん、このような現象は体験されていますでしょうか? 解決策をご存知の方、ご教授願います。 BASP21が悪いのかと思い、アンインストールしましたが、現象は再現します。 VB6の再インストールをしましたが、再現します。 以上よろしくお願いします。 VBで作成した実行形式をASPを用いて実行したい VBで作成した標準EXEをWEBサーバ上で実行しようと考えていまして現在苦悩しています。 BASP21を使用してEXEを実行したところ、PROCESSには起動したEXEが表示されているので実行はされてはいるのですが処理が適切になされていない状況です。 VBで作成した実行形式をASPを用いて実行する場合には、何か方法があるのでしょうか? よろしくおねがいします。 [動作環境] OS:Windows2000 ServerSP3 ブラウザー:IE6.0 VB6.0+SP5 実行形式の処理内容 SUB MAINを起動関数に設定し、OPEN関数でFILE書き込みを行う。 なお、このファイルはサーバー上に作成される。 VS2010 VB.Netのコンソールアプリについ VS2010 Exspress VB.Netのコンソールアプリケーションについて VB.Netのコンソールアプリケーションにて、 実行すると黒い画面が表示します、これを止めるにはどうすれば、良いのでしょうか? ※VB6では、標準EXEより、フォームを無くし、標準モジュールを追加しても黒い画面は、表示されません よろしくお願いします vb6.exe - アプリケーションエラー VBで作成したEXEを終了させた時、プロジェクトからプログラムを実行して、 プロジェクトを終了させた時に、下記エラーが発生します。 (プロジェクトを開いて閉じるだけではエラーは発生しない。) -------------------------------------------------------- "0x7c950a19"の命令が"0xffffffff"のメモリを参照しました。 メモリが"read"になることはできませんでした。 -------------------------------------------------------- 自分のPCで実行した時のみ発生します。 (他のPCで実行してもエラーは発生しません。) 何かわかる方がいらっしゃいましたらアドバイス頂けたらと思います。 宜しくお願い致します。 <環境> XP SP3 メモリ4G VB6.0 SP6 C言語で信頼できる時間誤差 C言語で信頼できる時間誤差 C言語のQueryPerformanceCounterを用いて時間を計測するプログラムを作りました. このとき時間の間隔は必ずしも500m秒になりません. 原因としては, 1. Sleep関数に含まれる誤差 2. QueryPerformanceCounter関数に含まれる誤差 の2つが考えられると思っています. そこで,質問ですが,1および2の誤差ってどの程度なのでしょうか? また,その他に誤差が出現するとすれば,それは何でしょうか. ちなみに,PCはwindows XPでMicrosoft Viusal Stadio 2010で動作させ, その他のアプリケーションは開いていない状況下で実行しました. サンプルプログラムにより実行しましたが,何が原因なのでしょうか? **********【サンプルプログラム】********** #include <stdio.h> #include <windows.h> void main (void){ LARGE_INTEGER m_pCounterFreq; LARGE_INTEGER m_pBeforeCounter; LARGE_INTEGER ulCounter; double dPassageSec; double pre =0.0; int counter; printf("取得時間,取得時間間隔\n"); QueryPerformanceFrequency( &m_pCounterFreq ); QueryPerformanceCounter( &m_pBeforeCounter ); for(counter=0;;counter++){ QueryPerformanceCounter( &ulCounter ); dPassageSec = (double)(ulCounter.QuadPart - m_pBeforeCounter.QuadPart) / (double)m_pCounterFreq.QuadPart; if(dPassageSec >= 5.2) break; Sleep(500); printf("%-12f,%-12f\n", dPassageSec, dPassageSec-pre); pre = dPassageSec; } } **********【実行結果一例】********** 取得時間,取得時間間隔 0.000002 ,0.000002 0.486344 ,0.486342←14msも誤差がある 0.986095 ,0.499751 1.486106 ,0.500012 1.986102 ,0.499995 2.486100 ,0.499998 2.986116 ,0.500016 3.486089 ,0.499973 3.986090 ,0.500001←ほぼ500ms 4.486092 ,0.500002 4.986208 ,0.500117 ヤバいパソコンが壊れたかも!?事前に知っておきたい3つの兆候と対策 OKWAVE コラム VB6→Access2000 OSはNT4.0です。VB6でプログラムを組んでいます。 データベースソフトはAccess2000です。 プログラムを実行すると【データベースの形式’ (データベースファイル名が表示)’を認識できません。】というメッセージボックスが表示されます。そのメッセージボックスにあるヘルプをクリックすると '項目' (Error 524)このエラーは、現在実行中のオートメーション オブジェクト内で発生しました。 と表示されまして、解決できません。 Accessの機能にある【MicroSoft Accessの旧バージョンのデータベースに変換】を行い、プログラムを実行すると動くのですが旧バージョンだというメッセージボックスが表示され使い勝手が非常に悪いです。何が悪いのでしょうか? Windows7 VB6ランタイムのインストール フォルダ内のファイル比較ツール 6.27 (FdateCompare) というフリーのソフトウェアをダウンロードして起動すると Fig1のようなメッセージが表示されたので VB6ランタイム(VisualBasic6.0 SP6 ランタイムライブラリ第4版) をダウンロードしてsetup.exeを管理者権限で実行 または、VB6SP6RT4.msiをダブルクックして実行すると 今度はFig2のようなメッセージが表示されました。 「エラー2709オフライン参加完了情報が見つかりませんでした」 で検索してみると、いろいろ見つかりましたが、 ウインドーズアップデートの「KB2918614 」が問題だとか レジストリーエディターでHKEY_LOCAL_MACHINE・・・ を修正するとかかなり難しいことが書かれてして 私にはまったく理解できませんでした。 また、この作業には危険が伴うようなことも書かれていました。 単にソフトウェアを普通にインストールして使いたいだけなのに なぜこのような危険で複雑な処理が必要なのか理解できません。 もっと簡単にVB6ランタイムをインストールすることは できないのでしょうか。OSはWindows7です。 よろしくお願いします。 [VB2010]関数・代入が順序正しく行われない [VB2010]関数・代入が順序正しく行われない VisualStudio 2010のVBを使用しております。 下記のようなコードを打ったとき一部のコードが実行されず(飛ばされている?)、困っています。 (Label1はPanel1上にある,Label1.text="null") Label1.Text = "text" Panel1.Visible = true Dim client As New Net.WebClient() 'あとから使う If NetworkInformation.NetworkInterface.GetIsNetworkAvailable Then Threading.Thread.Sleep(2000) Label1.Text = "ネットワーク接続 - 有効" End If このコードを実行すれば、まずLabel1.Textが"text"になるはずですが これがスキップされ(Label1が何故か表示されていない) Panel1が可視状態になり、If文が実行されます。 Visual Basic 2008 Expressを使用していた時からこのような症状はありましたが、 なぜこのような状態になるのかわかりません。 どのようにすれば正しく動作するようになりますでしょうか。 ご回答よろしくお願いします。 Format 関数のバグ? 今、OS:WindowsXP Pro SP2 VB:6.0 SP6 の環境でアプリケーションを作成しています。 上記の環境で、Format関数に関して質問があります。 今、2桁の文字列のコードをゼロ埋め(0 埋め)にして表示させたいと考えております。そこで、以下の関数を利用いたしました。 Format("19", "00") Format("1A", "00") Format("1B", "00") を呼び出し、"19","1A","1B"と返答結果を期待しているのですが、 実際に実行すると、"19","00","1B"と返答されてしまいます。 なぜ、"1A"だけ、"00"と返答されるのでしょうか。 仕様でしょうか? VB.NET DLL【API関数(コールバック関数)】の呼び出し方法について 目的は下記(3)のAPI関数をVB.NETで呼び出したいのですが、そこにいきつくまでにいろいろと壁にぶちあたっております。 (1)API関数をVB.NETから利用するにあたって どのような手順および調査・学習すればVB.NETからWin32 APIを独力で呼び出せるようになるのでしょうか?ネット上に情報が乏しく、いきずまっております。 (2)API関数の調査方法、またコールバック関数について 下記(a),(b)のようにWin32 API関数を宣言して、あとは呼び出し側の関数で(a),(b)で宣言したAPI関数を記述するだけで基本的には使用できるようになるという大まかなイメージはつかめております。 このあとでAPI関数をMSDNで調べると引数がHWNDやPCTSTRなど見慣れないものが出てきて、次のURL(http://www.atmarkit.co.jp/fdotnet/dotnettips/024w32api/w32api.html)を見ると、APIの型とVB.NETの型は違うので型変換をしなければならないとあります。またさらに私が呼び出したい関数はコールバック関数なるものでこれまた?な状態です。 そこでAPIとVB.NETの型変換の調査方法およびコールバック関数の利用方法などを教えていただけないでしょうか? (a)DllImport属性を利用する方法 <System.Runtime.InteropServices.DllImport("DLL名")> _ Function API関数名(仮引数) End Function (b)Declareステートメントを利用する方法 Declare Function API関数名 Lib "DLL名" (仮引数) (3)InstallHinfSection関数(http://msdn2.microsoft.com/en-us/library/aa376957.aspx)について 下記のコードを実行したのですが、実行時エラーにはならないのですが、APIの関数が動作してくれません。どこが悪いのかがまったく見当がつかないのですがどなたかアドバイスいただけると助かります。 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click InstallHinfSection(Nothing, Nothing, "DefaultInstall 132 C:\INF_TEST\Original.inf", 0) End Sub Declare Function InstallHinfSection Lib "setupapi" Alias "InstallHinfSection" (ByVal hwnd As String, ByVal ModuleHandle As String, ByVal CmdLineBuffer As String, ByVal nCmdShow As Integer) As Long APIが難しすぎていろいろとおかしなことを書いているかもしれませんが、どうぞよろしくお願いいたします。 2008ServerでVB6プログラム エラー Windows 2008 Server R2 SP1 64bit VB6のプログラムを実行すると 頻繁に下記が発生します 日時 : 2011/11/22 16:55:23 イベントの種類 : エラー コンピュータ : MIYA-SRV2 ユーザー : N/A ソース : Application Error カテゴリー : 100 アプリケーション クラッシュ イベント イベントID : 1000 Windows 2008 Server R2 64bit (SP1でない)場合は、 同様の現象は発生していません なぜでしょうか? 100%は発生しません vbのランタイムは正常にインストールされています VB2005のMDIについて はじめまして。現在、VB2005で開発しております。 MDIの操作で判らないところがありますので、ご存知の方がいましたら、教えてください。 MDIで開発しております。親フォームで発生したイベント内で子フォームに対してコントロール操作(画面を操作する関数を実行)を行うのですが、画面は全く動作しません。 ※デバックで確認するとコントロール操作しております。 対象の子フォームは必ず表示されていますが、必ずしも最前面にはいません。 今回のように親フォームから子フォームのメソッドを実行する際に動作する方法を教えてください。それとも、操作することは不可なのでしょうか。宜しくお願いします。 VB6で作成したCOMに厳密名を与える VS.NET上でVB6で作成したCOMを使用しようとしたのですが、ビルドを行った際に「アセンブリの生成に失敗しました--参照されたアセンブリ'XXX.xxx'は厳密な名前を持っていません」というエラーが発生してしまいます。 VS.NET上でCOMを使用する場合には自動的にRCWにより適切な形に変換されるという記述を読んだ気がするのですが、別に厳密名を与える処理を行わなくてはいけないのでしょうか。 .NET初心者のため情報が足りないかも知れないのですが、よろしくお願いします。 注目のQ&A 「You」や「I」が入った曲といえば? Part2 結婚について考えていない大学生の彼氏について 関東の方に聞きたいです 大阪万博について 駅の清涼飲料水自販機 不倫の慰謝料の請求について 新型コロナウイルスがもたらした功績について教えて 旧姓を使う理由。 回復メディアの保存方法 好きな人を諦める方法 小諸市(長野県)在住でスキーやスノボをする方の用具 カテゴリ パソコン・スマートフォン ソフトウェア Excel(エクセル)Word(ワード)PowerPoint(パワーポイント)Access(アクセス)その他MS Office製品オフィス系ソフトPhotoshop(フォトショップ)Illustrator(イラストレーター)その他Adobe製品画像・動画・音楽編集ホームページ作成ソフト筆まめ・はがき作成フリーウェア・フリーソフトその他(ソフトウェア) カテゴリ一覧を見る OKWAVE コラム 突然のトラブル?プリンター・メール・LINE編 携帯料金を賢く見直す!格安SIMと端末選びのポイントは? 友達って必要?友情って何だろう 大震災時の現実とは?私たちができる備え 「結婚相談所は恥ずかしい」は時代遅れ!負け組の誤解と出会いの掴み方 あなたにピッタリな商品が見つかる! OKWAVE セレクト コスメ化粧品 化粧水・クレンジングなど 健康食品・サプリ コンブチャなど バス用品 入浴剤・アミノ酸シャンプーなど スマホアプリ マッチングアプリなど ヘアケア 白髪染めヘアカラーなど インターネット回線 プロバイダ、光回線など
お礼
0.15がdoubleとなっていました。 参考にさせていただきます。