找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2195|回复: 19
打印 上一主题 下一主题
收起左侧

c语言如何用宏取一个小数的分子?

[复制链接]
跳转到指定楼层
楼主
ID:1043747 发表于 2022-11-29 11:24 来自手机 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
多谢大家帮助

1669692157193..jpg (677.33 KB, 下载次数: 84)

1669692157193..jpg
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:161164 发表于 2022-11-29 13:25 | 只看该作者
这不单是c语言和宏的问题
更是数学的分数约简问题(即最大公因数)
回复

使用道具 举报

板凳
ID:401564 发表于 2022-11-29 15:35 | 只看该作者
取一个小数的分子?这个时候分母在干嘛?
这是什么意思?
是我文化太低还是问题太深奥?
回复

使用道具 举报

地板
ID:384109 发表于 2022-11-29 16:39 | 只看该作者
应该是改变fraction的写法
回复

使用道具 举报

5#
ID:824490 发表于 2022-11-29 16:57 | 只看该作者
宏并不能节省空间,而一些复杂的功能可以用函数来做,所以你为什么不做一个你想要的功能的函数呢?
回复

使用道具 举报

6#
ID:1043747 发表于 2022-11-29 18:38 来自手机 | 只看该作者
名字不是重点 发表于 2022-11-29 16:57
宏并不能节省空间,而一些复杂的功能可以用函数来做,所以你为什么不做一个你想要的功能的函数呢?

因为,该值编译时可确定,我不想有运行开销
回复

使用道具 举报

7#
ID:1043747 发表于 2022-11-29 18:41 来自手机 | 只看该作者
Y_G_G 发表于 2022-11-29 15:35
取一个小数的分子?这个时候分母在干嘛?
这是什么意思?
是我文化太低还是问题太深奥?

比如fraction定义为0.5,那么numerator则为1(1/2的分子)
回复

使用道具 举报

8#
ID:384109 发表于 2022-11-29 20:22 | 只看该作者
为什么不能numerator = 1,然后fraction = numerator / 2呢
回复

使用道具 举报

9#
ID:824490 发表于 2022-11-29 21:00 | 只看该作者
censv 发表于 2022-11-29 18:38
因为,该值编译时可确定,我不想有运行开销

既然该值编译时可确定,为什么不直接定义?还要想着如何计算、如何列个公式不麻烦?
如:
//#define frq  11592000
//#define frq  12000000
#define frq  24000000

#if (frq ==11592000)
   #define circle  0
#endif

#if (frq ==12000000)
   #define circle  1
#endif

#if (frq ==24000000)
   #define circle  2
#endif
需要哪个frq,把其它的注释掉就OK了。
回复

使用道具 举报

10#
ID:624769 发表于 2022-11-29 21:10 | 只看该作者
censv 发表于 2022-11-29 18:41
比如fraction定义为0.5,那么numerator则为1(1/2的分子)

那么numerator 永远是1, 无论你 fraction 是多少。
即便,fraction = 2,  numerator 也可以 =1, (1/0.5 的分子)
回复

使用道具 举报

11#
ID:883242 发表于 2022-11-29 21:14 | 只看该作者
楼主的意思是12/11.0592化简为625/576这两个没有公倍数的数值的比值。但是公约数公倍数本身就是纯粹的整数的概念,如果输入是浮点数,那么就是无解的。楼主可以手撸出答案,但是在计算机上面不可能复现,因为11.0592在计算机内部浮点格式中,总是有误差的,不可能准确,自然无论如何也不可能算出结果。

题目本身就是大错特错,大家散了吧。
回复

使用道具 举报

12#
ID:1043747 发表于 2022-11-29 21:29 来自手机 | 只看该作者
人中狼 发表于 2022-11-29 20:22
为什么不能numerator = 1,然后fraction = numerator / 2呢

因为numerator的值取决于fraction
回复

使用道具 举报

13#
ID:1043747 发表于 2022-11-29 21:42 来自手机 | 只看该作者
Hephaestus 发表于 2022-11-29 21:14
楼主的意思是12/11.0592化简为625/576这两个没有公倍数的数值的比值。但是公约数公倍数本身就是纯粹的整数 ...

多谢帮助,给我了个确定的答案
回复

使用道具 举报

14#
ID:883242 发表于 2022-11-29 22:41 | 只看该作者
censv 发表于 2022-11-29 21:42
多谢帮助,给我了个确定的答案

你的这个数本身就没有意义,12000000/11059200去掉公约数,化简成两个互质数比值625/576,那么625的物理意义是什么?如果这个问题说不清,那么625这个数据就是毫无意义的。
回复

使用道具 举报

15#
ID:77589 发表于 2022-11-30 09:42 | 只看该作者
在C语言中,无论是整形数还是浮点数,都不可以能以分号的形式保存,即使你写成a/b的形式,编译器都会给你计算出具体的结果的。所以你的想法,应该是不能实现的。只能通过其他方法来实现。
回复

使用道具 举报

16#
ID:384109 发表于 2022-11-30 09:53 | 只看该作者
楼主没明白自己想要得到什么,也没明白#define是什么用法
回复

使用道具 举报

17#
ID:1043747 发表于 2022-11-30 09:55 来自手机 | 只看该作者
Hephaestus 发表于 2022-11-29 22:41
你的这个数本身就没有意义,12000000/11059200去掉公约数,化简成两个互质数比值625/576,那么625的物理 ...

625是在11.0592MHz下精确的最小整数时间(单位us)
回复

使用道具 举报

18#
ID:161164 发表于 2022-11-30 11:08 | 只看该作者
censv 发表于 2022-11-30 09:55
625是在11.0592MHz下精确的最小整数时间(单位us)

那么numerator只能用函数来算
  1. long Find_numerator(long dat)
  2. {
  3. char PP[3] = {2,3,5},i,j;
  4. long Mhz12 = 12000000;
  5. for(i=0;i<3;i++)
  6. {
  7.      j=100;
  8.      while(j--)
  9.      {
  10.         if(dat%PP[i]==0 && Mhz12%PP[i]==0)
  11.         {
  12.             dat/=PP[i];
  13.             Mhz12/=PP[i];
  14.         }else
  15.         {
  16.             break;
  17.         }
  18.      }
  19. }
  20. return dat;
  21. }
复制代码



回复

使用道具 举报

19#
ID:401564 发表于 2022-11-30 19:34 | 只看该作者
censv 发表于 2022-11-29 18:41
比如fraction定义为0.5,那么numerator则为1(1/2的分子)

你还不如说你要干嘛好点
不要想当然的认为一个问题可以“这样”解决,然后就问要怎么样都能达到“这样”的效果
0.1 0.2 0.3 0.4 0.5
哪个分子不是1,你不管分母,只管分子,这有什么意义呀?
回复

使用道具 举报

20#
ID:1043747 发表于 2022-11-30 22:17 来自手机 | 只看该作者
lkc8210 发表于 2022-11-30 11:08
那么numerator只能用函数来算

多谢你的帮助,开心每一天
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表