输入一个点坐标(两个浮点数),输出其到坐标原点的距离(保留2位有效数字)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了输入一个点坐标(两个浮点数),输出其到坐标原点的距离(保留2位有效数字)相关的知识,希望对你有一定的参考价值。
c++的代码
参考技术A #include<stdio.h>#include<math.h>
void main()
double x, y;
printf("请输入x和y坐标,用空格隔开 \n");
scanf("%lf%lf", &x, &y);
double l = sqrt(x * x + y * y);
printf("到原点的距离为: %.2lf\n", l);
追问
这句double l = sqrt(x * x + y * y);
C:\Documents and Settings\1k5-90-\桌面\MP4\df.c(10) : error C2143: syntax error : missing ';' before 'type'
错那了?
将三个坐标 (x,y,z) 编码为一个整数或浮点数
【中文标题】将三个坐标 (x,y,z) 编码为一个整数或浮点数【英文标题】:Encode three coordinates (x,y,z) in one integer or float number 【发布时间】:2016-11-23 18:36:08 【问题描述】:我在 C 中有一个程序,它使用 MPI 在进程之间发送 (x,y,z) 轴中特定点的坐标。因为发送的点是连续类型的(二维数组的行) ) 我想对存储在结构中的坐标进行编码
Struct pnts
int x;
int y;
int z;
pnt;
在一个数字中(INTEGER/FLOAT)我需要对这三个坐标进行编码 坐标是区间 [0, 28] 中的整数 例如:x = 16, y = 2, z = 4 相对于 x y z
有什么想法吗?
【问题讨论】:
N=x*Max^2 + y*Max + z
你可以像这样对它们进行位移:int coordinates = x<<16 | y << 8 | z
@Eugene Sh.也许N=x*(Max+1)^2 + y*(Max+1) + z
或N=(x*(Max+1) + y)*(Max+1) + z
在 SO 上已经有很多类似的问题,例如:bit-packing-of-array-of-integers 或 using-1-int-to-send-2-numbers
按原样,这是@BeyelerStudios 突出显示的副本。但是我强烈需要强调的是,您不需要甚至不想对这个特定的用例进行位操作。正如您在另一个问题中所说,MPI 完全能够发送一个结构或其数组,并且现有的答案可以解释如何做到这一点。
【参考方案1】:
这是一件非常简单的事情,您需要将 3 个字节编码为 32 位整数,允许 4。所以您需要的是
int32_t coordinates;
coordinates = x | (y << 8) | (z << 16);
然后您可以使用位标志的掩码访问坐标。
测试程序:
#include <stdint.h>
#include <stdio.h>
int
main(void)
int x = 16;
int y = 2;
int z = 4;
int32_t coordinates = x | (y << 8) | (z << 16);
fprintf(stdout, "x = %d\n", (coordinates & 0xFF));
fprintf(stdout, "y = %d\n", ((coordinates >> 8) & 0xFF));
fprintf(stdout, "z = %d\n", ((coordinates >> 16) & 0xFF));
return 0;
但是你不能编码 256,因为它需要多一个位,记住你从 20 开始,所以你只能用 8 位表示 255,所以这里有一个想法
#include <stdint.h>
#include <stdio.h>
#define XSHIFT 0
#define YSHIFT 9
#define ZSHIFT 18
#define GET_X(x) (((x) >> XSHIFT) & 0x1FF)
#define GET_Y(y) (((y) >> YSHIFT) & 0x1FF)
#define GET_Z(z) (((z) >> ZSHIFT) & 0x1FF)
#define ENCODE(x, y, z) (((x) << XSHIFT) | ((y) << YSHIFT) | ((z) << ZSHIFT))
int
main(void)
int32_t coordinates = ENCODE(256, 0, 1);
fprintf(stdout, "x = %d\n", GET_X(coordinates));
fprintf(stdout, "y = %d\n", GET_Y(coordinates));
fprintf(stdout, "z = %d\n", GET_Z(coordinates));
return 0;
在 32 位整数中使用剩余 8 位中的一个额外位。
注意:也许您(和其他人)认为定义XSHIFT
是多余的,但我认为这些表达式更有意义并且更易于阅读。这是我相信我从学习物理学中学到的东西,我很难在代码中看到像 x + 7
这样的东西,因为它是从物理定律得出的数学表达式。
【讨论】:
给定的范围是包容性的(这可能是问题,但无论如何)。 感谢您的回答!如果我想在数组中存储 32 位整数,这应该用一个字符数组来完成? 当然你可以使用char
,虽然最好使用unsigned char
。您可以在线阅读。
虽然这正确且很好地回答了 OP 的 Y 问题,但这完全没有认识到一开始就完全没有必要这样做。 MPI 完全有能力发送三个整数,无论是struct
、数组还是其他。没有理由求助于位魔术,使用适当的抽象要好得多。这也是welldocumented 上的 SO,正如 OPs 关于此问题的其他问题所指出的那样。
@BillG,MPI 类型可以嵌套。只需为一个点创建一个结构类型,然后为一个点数组创建一个连续的类型。此外,连续的 MPI 类型只是为了方便 - 你不需要一个来发送数组。以上是关于输入一个点坐标(两个浮点数),输出其到坐标原点的距离(保留2位有效数字)的主要内容,如果未能解决你的问题,请参考以下文章
c语言程序设计,输入一个点的坐标,输出沿原点逆时针旋转90度得到的坐标
luogu P6247 [SDOI2012]最近最远点对 |随机化