C 从浮点到整数

C 从浮点到整数,c,types,integer,C,Types,Integer,鉴于我的教授在一次考试中给我们的代码,这意味着我们不能修改代码,也不能使用来自其他库(stdio.h除外)的函数: 我必须找到一个条件,确保x在小数点右侧没有有效的数字,而不考虑浮点数的精度问题(在小数点之后,我们必须只有零)。我试过这个条件: while ((fmod((x*10),10))){ X = X*10 } printf(" %f ",x); 例如: INPUT x=0.456; --------> OUTPUT: 456.000 INPUT X=0.4567;---

鉴于我的教授在一次考试中给我们的代码,这意味着我们不能修改代码,也不能使用来自其他库(stdio.h除外)的函数:

我必须找到一个条件,确保x在小数点右侧没有有效的数字,而不考虑浮点数的精度问题(在小数点之后,我们必须只有零)。我试过这个条件:

while ((fmod((x*10),10))){
    X = X*10
}
printf(" %f ",x);
例如:

INPUT x=0.456; --------> OUTPUT: 456.000
INPUT X=0.4567;--------> OUTPUT; 4567.000
It is important to be sure that after the decimal point we don't have any        
significant number
但我必须包括math.h库,但我的教授不允许我们在这个具体案例中使用它(我甚至不允许使用(很久),因为我们在课堂上从未见过它)

那么,没有这个库,什么条件才能正确地解决问题呢?

正如前面所指出的,这是不可能的

浮动不准确。根据您的平台,0.001的浮点值实际上表示为类似于0.0010000001的值

您希望代码计算什么:10000001还是1


任何解决方案都只适用于某些值。

如前所述:由于浮点数的准确性,这实际上是不可能的,但我认为您的教授希望得到类似的结果

while (x  - (int)x != 0 )

您可以使用g修饰符而不是f来去除零:

printf(" %g \n",x);

我试着回答我的考题,如果我说错了,请纠正我

无法找到确保小数点后没有有效数字的适当条件。例如:我们想知道0.4*20的结果,即8.000,但由于不精确问题,输出将不同:

f=0.4;
for(i=1;i<20;i++)
   f=f+0.4;
printf("The number f=0.4*20 is ");
if(f!=8.0) {printf(" not ");}
printf(" %f ",8.0);
printf("The real answer is f=0.4*20= %f",f);
问题中存在模糊性(“不注意浮点数的精度问题”),但我认为寻求的答案如下,将
x
指定为整数类型,直到
x
不再具有小数部分


这种方法的成功取决于
INT\MIN这通常是没有意义的,因为浮点不能准确地表示大多数数字,小数位数的数量与其总精度一样多。你可以研究和测试内部位,我甚至不允许使用(长)因为我们从来没有在课堂上见过它,这是没有意义的。。。。cast是最简单的方法,尽管@2501已经写过,它并不准确。也许你的教授应该详细说明你在这个测试中的限制条件以及他/她期望的精度。如果你的教授没有意识到精度问题,你应该开始考虑改变学校/班级……;)请修改您的问题,并给出不同输入和期望输出的清晰示例。如果实际浮点值略小于预期值,则此操作将失败。典型的
float
具有6位以上的相对小数精度。它们的值是精确的。问题是,对
浮动的许多操作都会产生舍入,例如
浮动x=0.001的赋值。除了stdio.h之外,我不应该使用其他库中的函数,我只使用printf只是为了表明浮点数不精确。。。。和
Dipok_检验(0.001)在我的机器上产生
x:0.001000 y:10000001
。@undur\u gong或使用
float x=0.001
格式的典型
float
x
设置为
0.001000000047497451305389404296875
的精确值。
Dipok(float x)
接收的就是这个值。鉴于OP规定“不注意浮点数的精度问题,
10000001
的答案是可以的。OP肯定会将此作为其他应用程序的基础,并将使用循环计数
while((i=x)!=x)
进一步处理
100
10000001
或其他任何内容。虽然这在形式上是正确的,但我觉得有点牵强。我很想知道OP对这个案子的结果是否满意。
printf(" %g \n",x);
f=0.4;
for(i=1;i<20;i++)
   f=f+0.4;
printf("The number f=0.4*20 is ");
if(f!=8.0) {printf(" not ");}
printf(" %f ",8.0);
printf("The real answer is f=0.4*20= %f",f);
The number f=0.4*20 is not 8.000000 

The real answer is f=0.4*20= 8.000001
float Dipok(float x) {
  int i;
  while ((i=x) != x) {
      x = x*10;
  }
  return x;
}

#include <assert.h>
#include <stdio.h>
#include <float.h>

void Dipok_test(float x) {
  // suppose x NOT having an integer part
  assert(x > -1.0 && x < 1.0);
  float y = Dipok(x);
  printf("x:%.*f y:%.f\n", FLT_DECIMAL_DIG, x, y);
}

int main(void) {
  Dipok_test(0.456);
  Dipok_test(0.4567);
  return 0;
}
x:0.456000000 y:456
x:0.456699997 y:4567