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

float x;

(suppose x NOT having an integer part)
while (CONDITION){
    x = x*10
}

我必须找到一个条件,确保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库,但我的教授不允许我们在这种特殊情况下使用它(我甚至不允许使用(很长时间),因为我们从未在课堂上看到过它)。
那么,没有这个库,正确解决问题的条件是什么?

最佳答案

问题中存在模糊性(“不注意浮点数的精度问题”),但我认为下面是一个寻求的答案,将x赋给整数类型,直到x不再有小数部分为止。
这种方法的成功取决于INT_MIN <= x <= INT_MAX。当float的有效位数不超过int的值位时,这是预期的。虽然这是常见的,但C并没有指定它。作为替代方案,代码可以使用更宽的整数类型,如long long,但出现范围限制问题的可能性要小得多。
由于引入了*10的舍入,这种方法不是float文本转换的良好基础。

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

关于c - 从浮点数到整数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38198090/

10-13 04:18