This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP430FR59941:计算误差

Guru**** 649970 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1199169/msp430fr59941-calculation-error

器件型号:MSP430FR59941

您好!

我将在 CCS (Code Composer Studio)中执行一些计算。 当变量声明为浮点或双精度数时、计算会产生不准确的结果。

如何解决问题。

ALL_calculation_7.7 + 2.4 = 10.1  

ALL_calculation_9.8 - 5.6 = 4.2000000000000011 (错误)

ALL_calculation_5.9 * 2.7 = 15.930000000000001 (错误)

这是代码:

//

静态无符号 int Status_ALU = 0;
double alu_calculation_0.000;

ALL_calculation_=7.7 + 2.4;

if (alu_calculation_=10.100000)

ALL_calculation_0.000;
ALL_calculation_=9.8 - 5.6;

if (alu_calculation_=4.2)

STATUS_ALU = 1;


其他

STATUS_ALU = 0;

if (Status_ALU = 1)

ALL_calculation_5.9 * 2.7;

if (alu_calculation_=15.93)

STATUS_ALU = 1;


其他

STATUS_ALU = 0;

//

对此,

Vijay

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    欢迎使用浮点。 浮点值和双精度值只是近似值、即它们不是无限精度、您可以预期舍入和转换错误。 正如一位 Kernigham 和 Pl搅 龙所说的:"使用浮点就像移动沙堆一样。 每次移动时、您都会失去一点沙子、并添加一点污垢。"

    您需要处理您拥有的重要数字。

    如果您确实希望使用此类数字获得更高的精度、则可能需要切换到定点、无论如何、这种方法会更快。

    请阅读有关浮点的 C 语言编程常见问题解答:

    https://c-faq.com/fp/index.html

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    为了创下记录、我在使用 MSVS 2022的 C#中尝试了同样的东西。

    以下是相关代码:

    int Status_ALU = 0;
                double alu_calculation = 0.000;
    
                alu_calculation = 7.7 + 2.4;
                richTextBox1.AppendText("=10.1 :: " + alu_calculation.ToString() + '\n');
    
                if (alu_calculation == 10.100000)
                {
                    
                    alu_calculation = 0.000;
                    alu_calculation = 9.8 - 5.6;
                    richTextBox1.AppendText("=4.2 :: " + alu_calculation.ToString() + '\n');
    
                    if (alu_calculation == 4.2)
                    {
                        Status_ALU = 1;
                    }
                }
                else
                {
                    Status_ALU = 0;
                }
    
                if (Status_ALU == 1)
                {
                    alu_calculation = 5.9 * 2.7;
                    richTextBox1.AppendText("=15.93 :: " + alu_calculation.ToString() + '\n');
    
                    if (alu_calculation == 15.93)
                    {
                        Status_ALU = 1;
                    }
                }
                else
                {
                    Status_ALU = 0;
                }
    
                alu_calculation = 5.9 * 2.7;
                richTextBox1.AppendText("=15.93 :: " + alu_calculation.ToString() + '\n');

    结果如下:

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Keith、

    我将执行定点计算。

    感谢你的帮助。

    对此,

    Vijay