浮点异常 CS50 可读性赋值
Floating point exception CS50 readability assignment
我遇到了一些关于浮点异常错误的问题,因为以前我单独打印变量时我不确定哪里出了问题。下面是我到目前为止编写的代码。我不确定是什么原因导致错误,因为我很确定我没有被零除。
#include <stdio.h>
#include <cs50.h>
#include <ctype.h>
#include <string.h>
#include <math.h>
int main(void)
{
//promt user for text
string n = get_string("Text: ");
int sumletters = 0;
int sumdots = 0;
int sumspaces = 1;
for (int i = 0; i < strlen (n); i++ )
{
if (n[i] >= 'A' && n[i] <= 'z')
{
sumletters = sumletters + 1;
}
if (n[i] == ' ')
{
sumspaces = sumspaces + 1;
}
if (n[i] == '.' || n[i] == '?' || n[i] == '!' )
{
sumdots = sumdots + 1;
}
float L = sumletters / (sumspaces / 100);
float S = sumdots / (sumspaces / 100);
int index = round ((0.0588 * L) - (0.296 * S) - 15.8);
if (index < 1)
{
printf ("Before grade 1\n");
}
{
printf ("Grade 16+\n");
}
else
{
printf ("Grade %i", index);
}
}
printf ("\n");
}
这是错误的部分:
sumletters / (sumspaces / 100)
sumspaces / 100
使用整数除法,因此它几乎总是 0。您可以通过简单地分配除法来重构代码以使用浮点除法:
sumletters / sumspaces * 100
下面是整数除法,商通常为零,因为int
数学会舍弃分数。
int sumspaces;
...
sumspaces / 100
以下可能导致 int
除以 0。
int sumletters;
...
// v---------------v might be 0
sumletters / (sumspaces / 100);
Floating point exception error ... i am pretty sure i'm not dividing by zero.
由于常见错误处理程序的各种原因,int
除以零可能会报告为浮点异常。
因为很多操作的结果类型不在操作中,而只有赋值,这样的问题很常见。
相反,确保数学使用目标类型。
// v---------------v int division
// float L = sumletters / (sumspaces / 100);
float L = sumletters / (sumspaces / 100.0f);
// ^------------------^ At least float division
旁白:没有充分理由在这里使用 float
类型,只需使用 double
.
请注意,代码使用 double
数学,而不是 float
数学:
// v----v v---v v--v double constants
round ((0.0588 * L) - (0.296 * S) - 15.8)
// ^---^ double function
我遇到了一些关于浮点异常错误的问题,因为以前我单独打印变量时我不确定哪里出了问题。下面是我到目前为止编写的代码。我不确定是什么原因导致错误,因为我很确定我没有被零除。
#include <stdio.h>
#include <cs50.h>
#include <ctype.h>
#include <string.h>
#include <math.h>
int main(void)
{
//promt user for text
string n = get_string("Text: ");
int sumletters = 0;
int sumdots = 0;
int sumspaces = 1;
for (int i = 0; i < strlen (n); i++ )
{
if (n[i] >= 'A' && n[i] <= 'z')
{
sumletters = sumletters + 1;
}
if (n[i] == ' ')
{
sumspaces = sumspaces + 1;
}
if (n[i] == '.' || n[i] == '?' || n[i] == '!' )
{
sumdots = sumdots + 1;
}
float L = sumletters / (sumspaces / 100);
float S = sumdots / (sumspaces / 100);
int index = round ((0.0588 * L) - (0.296 * S) - 15.8);
if (index < 1)
{
printf ("Before grade 1\n");
}
{
printf ("Grade 16+\n");
}
else
{
printf ("Grade %i", index);
}
}
printf ("\n");
}
这是错误的部分:
sumletters / (sumspaces / 100)
sumspaces / 100
使用整数除法,因此它几乎总是 0。您可以通过简单地分配除法来重构代码以使用浮点除法:
sumletters / sumspaces * 100
下面是整数除法,商通常为零,因为int
数学会舍弃分数。
int sumspaces;
...
sumspaces / 100
以下可能导致 int
除以 0。
int sumletters;
...
// v---------------v might be 0
sumletters / (sumspaces / 100);
Floating point exception error ... i am pretty sure i'm not dividing by zero.
由于常见错误处理程序的各种原因,int
除以零可能会报告为浮点异常。
因为很多操作的结果类型不在操作中,而只有赋值,这样的问题很常见。
相反,确保数学使用目标类型。
// v---------------v int division
// float L = sumletters / (sumspaces / 100);
float L = sumletters / (sumspaces / 100.0f);
// ^------------------^ At least float division
旁白:没有充分理由在这里使用 float
类型,只需使用 double
.
请注意,代码使用 double
数学,而不是 float
数学:
// v----v v---v v--v double constants
round ((0.0588 * L) - (0.296 * S) - 15.8)
// ^---^ double function