从浮点数到整数

时间:2016-07-05 07:57:00

标签: c types integer

鉴于我的教授在考试中给我们的代码,这意味着我们不能修改代码,也不能使用其他库中的函数(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库但是我的教授不允许我们在这个特定的情况下使用它(我甚至不允许使用(长)因为我们从未在课堂上看过它)。

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

4 个答案:

答案 0 :(得分:2)

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

var activeBrowserWindow = require("sdk/window/utils").getMostRecentBrowserWindow();

Cu.import("resource://gre/modules/Services.jsm");

var gSSService = Cc["@mozilla.org/ssservice;1"]
    .getService(Ci.nsISiteSecurityService);

// For now, STS data gets stored in permissions.sqlite.
// See https://bugzilla.mozilla.org/show_bug.cgi?id=775370.

var permissionManager = Cc["@mozilla.org/permissionmanager;1"]
    .getService(Ci.nsIPermissionManager);

// We should not store anything permanent in permissions.sqlite in private
// browsing mode.

var FLAGS = require("sdk/private-browsing").isPrivate(activeBrowserWindow) ?
    Ci.nsISocketProvider.NO_PERMANENT_STORAGE : 0;

var STS_TYPE = Ci.nsISiteSecurityService.HEADER_HSTS;

var tabs = require("sdk/tabs");
tabs.on('ready', function(tab) {

    var URL = tab.url;
    var url = require("sdk/url").URL(URL);
    var hostname = url.hostname;
    //console.log(hostname);

    function isSecureUri(hostname) {
        var uri = Services.io.newURI("https://" + hostname, null, null);
        var resultURI = gSSService.isSecureURI(STS_TYPE, uri, FLAGS);

        return resultURI;
     }

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

您可以使用g修饰符而不是f:

来消除零
while (x  - (int)x >= 0.00000001 )

答案 1 :(得分:0)

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

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

您希望代码计算什么:10000001或1?

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

答案 2 :(得分:0)

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

无法找到确保小数点后面没有有效数字的正确条件。例如:我们想知道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);

我们的输出将是:

The number f=0.4*20 is not 8.000000 

The real answer is f=0.4*20= 8.000001

答案 3 :(得分:0)

在问题中存在模糊性(&#34;没有注意浮点数的精度问题&#34;),但我认为下面是一个寻求的答案,将x赋给整数类型直到x不再有小数部分。

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

鉴于*10引入了四舍五入,此方法 不是<{1}}文本转换的良好基础。

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