热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

从浮点数到整数-Fromafloattoaninteger

Giventhiscodethatmyprofessorgaveusinanexamwhichmeanswecannotmodifythecodenorusef

Given this code that my professor gave us in an exam which means we cannot modify the code nor use function from other libraries (except stdio.h):

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

float x;

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

I have to find the condition that makes sure that x has no valid number to the right of decimal point not giving attention to the problems of precision of a float number (After the decimal point we have to have only zeros). I tried this condition:

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

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

example:

例:

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

But I had to include math.h library BUT my professor doesn't allow us to use it in this specific case (I'm not even allowed to use (long) since we never seen it in class).

但我必须包括math.h库但是我的教授不允许我们在这个特定情况下使用它(我甚至不允许使用(长),因为我们从未在课堂上看过它)。

So what is the condition that solve the problem properly without this library?

那么没有这个库可以正确解决问题的条件是什么?

4 个解决方案

#1


0  

There is fuzziness ("not giving attention to the problems of precision of a float number") in the question, yet I think a sought answer is below, assign x to an integer type until x no longer has a fractional part.

在问题中存在模糊性(“不注意浮点数的精度问题”),但我认为下面是一个寻求的答案,将x指定为整数类型,直到x不再具有小数部分。

Success of this method depends on INT_MIN <= x <= INT_MAX. This is expected when the number of bits in the significant of float does not exceed the value bits of int. Although this is common, it is not specified by C. As an alternative, code could with a wider integer type like long long with a far less chance of the range restriction issue.

此方法的成功取决于INT_MIN <= x <= INT_MAX。当float的有效位中的位数不超过int的值位时,这是预期的。虽然这很常见,但它没有由C指定。作为替代方案,代码可以使用更长的整数类型,例如long long,并且范围限制问题的可能性要小得多。

Given the rounding introduced with *10, this method is not a good foundation of float to text conversion.

鉴于* 10引入了舍入,这种方法不是浮点到文本转换的良好基础。

float Dipok(float x) {
  int i;
  while ((i=x) != x) {
      x = x*10;
  }
  return x;
}

#include 
#include 
#include 

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;
}

Output

产量

x:0.456000000 y:456
x:0.456699997 y:4567

#2


2  

As pointed out here previously:Due to the accuracy of floats this is not really possible but I think your Prof wants to get something like

正如前面所指出的:由于浮子的准确性,这实际上是不可能的,但我认为你的教授希望得到类似的东西

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

or

要么

while (x  - (int)x >= 0.00000001 )

You can get rid of the zeroes by using the g modifier instead of f:

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

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

#3


0  

As already pointed out by 2501, this is just not possible.

正如2501所指出的那样,这是不可能的。

Floats are not accurate. Depending on your platform, the float value for 0.001 is represented as something like 0.0010000001 in fact.

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

What would you expect the code to calculate: 10000001 or 1?

你期望代码计算什么:10000001或1?

Any solution will work for some values only.

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

#4


0  

I try to answer to my exam question please if I say something wrong correct me!

如果我说错了,我会尽量回答我的考试问题!

It is not possible to find a proper condition that makes sure that there are no valid number after the decimal point. For example : We want to know the result of 0.4*20 which is 8.000 BUT due to imprecision problems the output will be different:

无法找到确保小数点后面没有有效数字的正确条件。例如:我们想知道0.4 * 20的结果是8.000 BUT由于不精确的问题输出会有所不同:

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);

Our OUTPUT will be:

我们的输出将是:

The number f=0.4*20 is not 8.000000 

The real answer is f=0.4*20= 8.000001

推荐阅读
  • 本文介绍了UVALive6575题目Odd and Even Zeroes的解法,使用了数位dp和找规律的方法。阶乘的定义和性质被介绍,并给出了一些例子。其中,部分阶乘的尾零个数为奇数,部分为偶数。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • IjustinheritedsomewebpageswhichusesMooTools.IneverusedMooTools.NowIneedtoaddsomef ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 成功安装Sabayon Linux在thinkpad X60上的经验分享
    本文分享了作者在国庆期间在thinkpad X60上成功安装Sabayon Linux的经验。通过修改CHOST和执行emerge命令,作者顺利完成了安装过程。Sabayon Linux是一个基于Gentoo Linux的发行版,可以将电脑快速转变为一个功能强大的系统。除了作为一个live DVD使用外,Sabayon Linux还可以被安装在硬盘上,方便用户使用。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • 本文介绍了一个题目的解法,通过二分答案来解决问题,但困难在于如何进行检查。文章提供了一种逃逸方式,通过移动最慢的宿管来锁门时跑到更居中的位置,从而使所有合格的寝室都居中。文章还提到可以分开判断两边的情况,并使用前缀和的方式来求出在任意时刻能够到达宿管即将锁门的寝室的人数。最后,文章提到可以改成O(n)的直接枚举来解决问题。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
author-avatar
mobiledu2502901317
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有