Valgrindを使用したlongdoubleのstd :: fpclassifyの結果が間違っています

グルットン

私は奇妙な行動に出くわします。このプログラムでは、浮動小数点値がゼロに等しいかどうかを確認してみます。

#include <cstdlib>
#include <cmath>
#include <iostream>

int main ()
{
    float       fa (0), fb (0);
    double      da (0), db (0);
    long double la (0), lb (0);

    cout << "Float:       " << (FP_ZERO == fpclassify (fa - fb) ) << endl;
    cout << "Double:      " << (FP_ZERO == fpclassify (da - db) ) << endl;
    cout << "Long double: " << (FP_ZERO == fpclassify (la - lb) ) << endl;
    cout << "Float:       " << (FP_ZERO == fpclassify (fa - 42) ) << endl;
    cout << "Double:      " << (FP_ZERO == fpclassify (da - 42) ) << endl;
    cout << "Long double: " << (FP_ZERO == fpclassify (la - 42) ) << endl;

    return EXIT_SUCCESS;
}

プログラムの結果は予測可能です。

$ ./llvlg 
Float:       1
Double:      1
Long double: 1
Float:       0
Double:      0
Long double: 0

しかし、Valgrindを介してプログラムを起動すると、長いダブルゼロの結果は間違ったものになります。

$ valgrind ./llvlg 
==7521== Memcheck, a memory error detector
==7521== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
==7521== Using Valgrind-3.12.0.SVN and LibVEX; rerun with -h for copyright info
==7521== Command: ./llvlg
==7521== 
Float:       1
Double:      1
Long double: 0
Float:       0
Double:      0
Long double: 0
==7521== 
==7521== HEAP SUMMARY:
==7521==     in use at exit: 0 bytes in 0 blocks
==7521==   total heap usage: 2 allocs, 2 frees, 73,728 bytes allocated
==7521== 
==7521== All heap blocks were freed -- no leaks are possible
==7521== 
==7521== For counts of detected and suppressed errors, rerun with: -v
==7521== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)

それはバグですか、それとも予想される動作ですか?

UPDここで
入手可能なプログラムのソースコードビルドオプション:私の環境:
g++ main.cpp -O0 -o llvlg

  • $ uname -a Linux tiptop 4.8.0-53-generic #56-Ubuntu SMP Tue May 16 00:23:44 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

  • $ gcc --version gcc (Ubuntu 6.2.0-5ubuntu12) 6.2.0 20161005

  • $ valgrind --version valgrind-3.12.0.SVN

  • $ cat /proc/cpuinfo ... model name : Intel(R) Core(TM) i7-4700MQ CPU @ 2.40GHz ...

ポールフロイド

これは、Valgrindで予想される動作です。これは既知の制限です。内部的に長いdoubleは、64ビット(double)の精度でのみ表されます。

こちらをご覧ください

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

MySQLの結合が間違っています結果

分類Dev

Pythonを使用したGoogleScrapeの結果の数が間違っています

分類Dev

eulerProjectの関数の結果が間違っています

分類Dev

MDX結果の合計が間違っています

分類Dev

ElasticSearch結果のスコアが間違っています

分類Dev

dimplejs散布図の結果が間違っています

分類Dev

Application.Sumの結果が間違っています

分類Dev

NSDateFormatter dateFromStringの結果が間違っていますか?

分類Dev

!dumpheapの結果が間違っています

分類Dev

Python math.arctan()の結果が間違っていますか?

分類Dev

usort関数の結果が間違っています

分類Dev

ElasticsearchMatchQueryが間違った結果を返しています

分類Dev

phpでxpathを使用すると、結果の数が間違っています

分類Dev

Oracleの "order by"句は、結果を間違った順序で返すか、結果が欠落しています

分類Dev

Haskell repa:2つの配列の内積結果が間違っています

分類Dev

PHPのarray_count_valuesの結果が間違っています

分類Dev

Objective-Cでは、fabsf()の結果タイプが間違っています

分類Dev

Conv2dTensorflowの結果が間違っています-精度= 0.0000e + 00

分類Dev

タイムデルタ操作の結果が間違っています

分類Dev

hash_djb2 PHPの結果が間違っていますか?

分類Dev

setIntervalによる関数の結果が間違っています

分類Dev

AES New InstructionSetを使用した復号化の結果が間違っています

分類Dev

PythonのLinearRegressionが間違った結果を出しますか?

分類Dev

Cのプログラムが間違った結果を示しています、奇数

分類Dev

Cのプログラムが間違った結果を示しています、奇数

分類Dev

クエリ結果でのHibernate結合継承のタイプが間違っています

分類Dev

グループ連結の問題、結果は間違っています

分類Dev

2つの日付を比較するJavascriptの結果が間違っている

分類Dev

Djangoクエリセットの結果がテストに対して間違っています

Related 関連記事

  1. 1

    MySQLの結合が間違っています結果

  2. 2

    Pythonを使用したGoogleScrapeの結果の数が間違っています

  3. 3

    eulerProjectの関数の結果が間違っています

  4. 4

    MDX結果の合計が間違っています

  5. 5

    ElasticSearch結果のスコアが間違っています

  6. 6

    dimplejs散布図の結果が間違っています

  7. 7

    Application.Sumの結果が間違っています

  8. 8

    NSDateFormatter dateFromStringの結果が間違っていますか?

  9. 9

    !dumpheapの結果が間違っています

  10. 10

    Python math.arctan()の結果が間違っていますか?

  11. 11

    usort関数の結果が間違っています

  12. 12

    ElasticsearchMatchQueryが間違った結果を返しています

  13. 13

    phpでxpathを使用すると、結果の数が間違っています

  14. 14

    Oracleの "order by"句は、結果を間違った順序で返すか、結果が欠落しています

  15. 15

    Haskell repa:2つの配列の内積結果が間違っています

  16. 16

    PHPのarray_count_valuesの結果が間違っています

  17. 17

    Objective-Cでは、fabsf()の結果タイプが間違っています

  18. 18

    Conv2dTensorflowの結果が間違っています-精度= 0.0000e + 00

  19. 19

    タイムデルタ操作の結果が間違っています

  20. 20

    hash_djb2 PHPの結果が間違っていますか?

  21. 21

    setIntervalによる関数の結果が間違っています

  22. 22

    AES New InstructionSetを使用した復号化の結果が間違っています

  23. 23

    PythonのLinearRegressionが間違った結果を出しますか?

  24. 24

    Cのプログラムが間違った結果を示しています、奇数

  25. 25

    Cのプログラムが間違った結果を示しています、奇数

  26. 26

    クエリ結果でのHibernate結合継承のタイプが間違っています

  27. 27

    グループ連結の問題、結果は間違っています

  28. 28

    2つの日付を比較するJavascriptの結果が間違っている

  29. 29

    Djangoクエリセットの結果がテストに対して間違っています

ホットタグ

アーカイブ