假设我有两种算术类型,一个整数I
,一个浮点数,F
.我还假设std::numeric_limits<I>::max()
小于std::numeric_limits<F>::max()
.
现在,假设我有一个正整数值i
.因为可表示的范围F
大于I
,F(i)
应始终定义行为.
但是,如果我有一个浮点值f
,那么f == F(i)
,是否I(f)
定义明确?换句话说,I(F(i))
总是定义行为?
C++ 14标准的相关部分:
4.9浮动积分转换 [conv.fpint]
- 可以将浮点类型的prvalue转换为整数类型的prvalue.转换截断; 也就是说,丢弃小数部分.如果截断的值无法在目标类型中表示,则行为未定义.[ 注意:如果目的地类型是
bool
,请参见4.12.- 结束说明 ]- 可以将整数类型或无范围枚举类型的prvalue转换为浮点类型的prvalue.如果可能,结果是准确的.如果要转换的值在可以表示的值范围内,但该值无法准确表示,则它是实现定义的下一个较低或较高可表示值的选择.[ 注意:如果积分值不能完全表示为浮动类型的值,则会发生精度损失.- 结束注释 ]如果转换的值超出了可以表示的值范围,则行为未定义.如果源类型为
bool
,则将值false
转换为零,并将值true
转换为1.
我需要生成一个二进制文件,其中只包含唯一的随机数,具有单精度.然后,目的是计算该文件的熵并将其与其他数据集熵一起使用以计算比率entropy_file/entropy_randUnique.该值被命名为"随机性".
我可以在python中使用双精度数字并插入它们set()
,使用struct.pack
如下:
numbers = set()
while len(numbers) < size:
numbers.add(struct.pack(precision,random.random()))
for num in numbers:
file.write(num)
Run Code Online (Sandbox Code Playgroud)
但是当我改为单精度时,我不能只改变包方法(这会产生很多相同的数字而while会永远不会结束),而且我无法生成单精度数random
.我已经研究过,numpy
但发电机的工作原理与我理解的相同.如何在二进制文件中获得370914252(这是我最大的测试用例)唯一的float32,即使它们不是随机的,我认为一个洗牌序列就足够了......
python floating-point numpy floating-point-precision floating-point-conversion
我有以下代码片段:
package main
import("fmt";"flag")
func main() {
var a = flag.Int("a",0,"divident")
var b = flag.Int("b",1,"divisor")
flag.Parse()
fmt.Printf("%f",*a / *b )
}
Run Code Online (Sandbox Code Playgroud)
对于-a 3和-b 2命令行参数,输出为: %!f(int=1)
强迫这种划分成为浮点的最佳/最优雅的方法是什么?
我想创建一个函数formatFloat()
,它接受任何浮动并将其格式化为十进制扩展字符串.例如:
formatFloat(1.0E+25); // "10,000,000,000,000,000,000,000,000"
formatFloat(1.0E+24); // "1,000,000,000,000,000,000,000,000"
formatFloat(1.000001); // "1.000001"
formatFloat(1.000001E-10); // "0.0000000001000001"
formatFloat(1.000001E-11); // "0.00000000001000001"
Run Code Online (Sandbox Code Playgroud)
只要铸造浮子字符串都不行,因为花车比约大1.0E+14
,或比约较小1.0E-4
,PHP使得他们在科学记数法,而不是十进制扩展.
number_format()
是尝试的明显的PHP功能.但是,大浮动会出现此问题:
number_format(1.0E+25); // "10,000,000,000,000,000,905,969,664"
number_format(1.0E+24); // "999,999,999,999,999,983,222,784"
Run Code Online (Sandbox Code Playgroud)
对于小浮点数,难点在于选择要求的小数位数.一个想法是要求大量的十进制数字,然后rtrim()
是多余0
的数字.但是,这个想法是有缺陷的,因为十进制扩展通常不会以0
s 结尾:
number_format(1.000001, 30); // "1.000000999999999917733362053696"
number_format(1.000001E-10, 30); // "0.000000000100000099999999996746"
number_format(1.000001E-11, 30); // "0.000000000010000010000000000321"
Run Code Online (Sandbox Code Playgroud)
问题是浮点数的精度有限,通常无法存储文字的确切值(例如:) 1.0E+25
.相反,它存储可以表示的最接近的可能值. number_format()
揭示了这些"最接近的近似值".
我发现这个评论深埋在sprintf()
页面中,令人惊讶的是没有任何赞成票:
以下是如何使用16位有效数字打印浮点数,无论大小如何:
$result = sprintf(sprintf('%%.%dF', max(15 - …
Run Code Online (Sandbox Code Playgroud) 我正在开发具有必须在Linux,UNIX和Windows上运行的单元测试的OS便携式软件.
想象一下这个单元测试断言IEEE单精度浮点值1.26743237e + 015f被转换为字符串:
void DataTypeConvertion_Test::TestToFloatWide()
{
CDataTypeConversion<wchar_t> dataTypeConvertion;
float val = 1.26743237e+015f;
wchar_t *valStr = (wchar_t*)dataTypeConvertion.ToFloat(val);
std::wcout << valStr << std::endl;
int result = wcscmp(L"1.26743E+015", valStr);
CPPUNIT_ASSERT_EQUAL(0, result);
delete [] valStr;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:只要浮点数是IEEE,所有操作系统和处理器都会将浮点数转换为字符串"1.26743E + 015"吗?我问,因为我知道数学CPU可能无法返回准确的结果,我想知道这是否会在不同的处理器上产生不同的结果,因为它们可能在处理器架构内部具有不同的IEEE浮点运算硬件实现.
c++ floating-point precision floating-accuracy floating-point-conversion
XCode 6.3.1 Swift 1.2
let value: Int = 220904525
let intmax = Int.max
let float = Float(value) // Here is an error probably
let intFromFloat = Int(float)
let double = Double(value)
println("intmax=\(intmax) value=\(value) float=\(float) intFromFloat=\(intFromFloat) double=\(double)")
// intmax=9223372036854775807 value=220904525 float=2.20905e+08 intFromFloat=220904528 double=220904525.0
Run Code Online (Sandbox Code Playgroud)
初始值是220904525.但是当我将它转换为浮动时它变为220904528.为什么?
floating-point ios floating-point-precision floating-point-conversion swift
使用scanf,输入的每个数字,我希望我的程序打印出两行:例如
byte order: little-endian
> 2
2 0x00000002
2.00 0x40000000
> -2
-2 0xFFFFFFFE
-2.00 0xC0000000
Run Code Online (Sandbox Code Playgroud)
我可以得到它以十六进制打印2但我也需要一个浮点数当然我不能扫描为一个当我还需要扫描为一个int
如果我在尝试printf时投射为浮动,我会得到一个零.如果我作为浮点扫描我得到正确的输出.我试图将int转换为float,但它仍然是零.
到目前为止这是我的输出
Int - float - hex
byte order: little-endian
>2
2 0x000002
2.00 00000000
Run Code Online (Sandbox Code Playgroud)
它看起来像我正在转换为漂浮为什么不打印作为十六进制?如果我作为一个浮点扫描我得到正确的十六进制表示,如第一个例子.这应该是简单的事情.我确实需要以小数形式扫描,记住我在cygwin中运行它
这是我到目前为止...
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int HexNumber;
float convert;
printf("Int - float - hex\n");
int a = 0x12345678;
unsigned char *c = (unsigned char*)(&a);
if (*c == 0x78)
{
printf("\nbyte order: little-endian\n");
}
else
{
printf("\nbyte order: big-endian\n");
}
printf("\n>");
scanf("%d", …
Run Code Online (Sandbox Code Playgroud) 尝试时遇到编译器错误
float_val=float_val<<1;
Run Code Online (Sandbox Code Playgroud)
它给出了一个错误,说"错误C2296:'<<':非法,左操作数的类型为'float'"
不能左移左浮球?为什么会这样?
我遇到了一个基本的MySQL查询令人困惑的问题.
这是我的表:
id | rating
1 | 1317.17
2 | 1280.59
3 | 995.12
4 | 973.88
Run Code Online (Sandbox Code Playgroud)
现在,我试图找到rating
列大于某个值的所有行.如果我尝试以下查询:
SELECT * FROM (`users`) WHERE `rating` > '995.12'
Run Code Online (Sandbox Code Playgroud)
它正确返回2
.
但是,如果我尝试
SELECT * FROM (`users`) WHERE `rating` > '973.88'
Run Code Online (Sandbox Code Playgroud)
它回来了4
!所以就好像它认为表中的973.88大于973.88,但它与995.12没有同样的错误.无论我是从PHP脚本还是在phpMyAdmin中运行查询,都会发生这种情况.
有任何想法吗?
mysql floating-point floating-accuracy floating-point-conversion
有人可以在32位机器上解释这个奇怪的输出吗?
#include <stdio.h>
int main() {
printf("16777217 as float is %.1f\n",(float)16777217);
printf("16777219 as float is %.1f\n",(float)16777219);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
产量
16777217 as float is 16777216.0
16777219 as float is 16777220.0
Run Code Online (Sandbox Code Playgroud)
奇怪的是,16777217投射到较低的值,而16777219投射到更高的值......