鉴于我的教授在考试中给我们的代码,这意味着我们不能修改代码,也不能使用其他库中的函数(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库但是我的教授不允许我们在这个特定的情况下使用它(我甚至不允许使用(长)因为我们从未在课堂上看过它)。
那么没有这个库可以正确解决问题的条件是什么?
答案 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;
}