鉴于我的教授在一次考试中给我们的代码,这意味着我们不能修改代码,也不能使用其他库中的函数(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/