【问题标题】:Accurate precision in float in C [closed]C中浮点数的准确精度[关闭]
【发布时间】:2018-06-20 19:25:40
【问题描述】:

鉴于我的程序用于图像中的问题。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main()
{
    int N,R,A[100],B[100],i,flag=0;
    double sol;
    scanf("%d%d",&N,&R);

    for(i=0;i<N;i++)
    {
        scanf("%d",&A[i]);
    }
    for(i=0;i<N;i++)
    {
        scanf("%d",&B[i]);
    }
    for(i=0;i<N;i++)
    {
        if(R>=A[i]&&R<=A[i+1])
        {
            sol=(double)R-(R*B[i])/100;
            flag++;
        }
    }
    if(flag==0)
    {
        sol=(double)R;
    }
    printf("%.2f",sol);
}

这个程序通过了三个测试用例。但失败了五次。并显示预期输出 3176.5,实际输出为 3177.0。如何清除所有案件。

enter image description here

【问题讨论】:

  • 注意A[i+1] 可能在最后一次循环迭代中越界,但您尚未检查任何内容。严谨一点,检查scanf(那是什么)的返回值和实际的输入值。
  • (R*B[i])/100 是整数计算。一个操作数需要转换为double
  • 抱歉,我没听懂。 A[i+1] 可以为此做什么......以及使用 scanf 值检查什么。
  • 那么请阅读scanf 手册页以了解其返回值的含义。
  • 只有第一个词,见@dbush 回答。

标签: c logic


【解决方案1】:

问题出在这里:

sol=(double)R-(R*B[i])/100;

子表达式(R*B[i])/100 中的每个变量和常量都有int 类型,所以结果也是int 类型。除法运算是截断结果的整数除法。您对 R 的强制转换还不够,因为减法的右侧操作数已被评估为 int

将常量100 更改为100.0。这将给它类型double,这将导致除法为浮点除法。

sol=(double)R-(R*B[i])/100.0;

此外,以下比较将在最后一次迭代中读取数组 A 的末尾:

if(R>=A[i]&&R<=A[i+1])

你需要考虑最后一项的情况:

if((R>=A[i]) && ((i==N-1) || (R<=A[i+1])) )

【讨论】:

  • 天啊,它已经工作并清除了所有案例。非常感谢先生,:)
  • @VishnuPriya 很高兴我能帮上忙。如果您觉得有用,请随时 accept this answer
  • @dbush 无需转换为doubleint - doubledouble)。此外,根据RB[i] 的值,您可能会出现整数溢出,因此可能需要(double)R*B[i](并且演员回来了:))
  • 哦,我现在明白了,先生,
猜你喜欢
  • 2021-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-22
  • 2018-05-09
  • 1970-01-01
相关资源
最近更新 更多